当前位置: 首页 > news >正文

【Java】I/O 流篇 —— 打印流与压缩流

目录

  • 打印流
    • 概述
    • 字节打印流
      • 构造方法
      • 成员方法
      • 代码示例
    • 字符打印流
      • 构造方法
      • 成员方法
      • 代码示例
    • 打印流的应用场景
  • 解压缩/压缩流
    • 解压缩流
    • 压缩流
  • Commons-io 工具包
    • 概述
    • Commons-io 使用步骤
    • Commons-io 常见方法
    • 代码示例
  • Hutool 工具包

打印流

概述

分类:打印流一般是指字节打印流 PrintStream、字符打印流 PrintWriter 两个类,打印流只有输出流没有输入流

特点:

  1. 打印流只操作文件的目的地,不操作数据源
  2. 特有的写出方法可以实现数据原样写出
    • 文件中是 97,打印 97
    • 文件中是 true,打印 true
  3. 特有的写出方法,可以实现自动刷新,自动换行
    • 打印一次数据 = 写出 + 换行 + 刷新

字节打印流

构造方法

  • public PrintStream(OutputStream/File/String) 关联字节输出流/文件/文件路径
  • public PrintStream(String fileName,Charset charset) 指定字符集
  • public PrintStream(OutputStream out,boolean autoFlush) 可设置是否自动刷新
  • public PrintStream(OutputStream out,boolean autoFlush,String encoding) 指定字符集且可设置是否自动刷新

注意事项:字节流底层没有缓冲区,开不开自动刷新都一样

成员方法

  • public void write(int b) 常规方法,跟之前一样,将指定的字节写出
  • public void println(Xxx xx) 特有方法,打印任意数据,自动刷新,自动换行
  • public void print(Xxx xx) 特有方法,打印任意数据,不换行
  • public void printf(String format,Object...args) 特有方法,带有占位符的打印语句,不换行

代码示例


import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;public class printStream {public static void main(String[] args) throws IOException, FileNotFoundException {// 创建对象PrintStream ps = new PrintStream(new FileOutputStream("bbb.txt"),true,"UTF-8");// 写出数据ps.println(97);ps.print(true);ps.println();ps.printf("%s爱上了%s", "阿珍", "阿强");// 释放资源ps.close();}
}

字符打印流

构造方法

  • public PrintWriter(Write/File/String) 关联字节输出流、文件或文件路径
  • public PrintWriter(String fileName, Charset charset) 指定字符集
  • public PrintWriter(Write w, boolean autoflush) 可设置是否自动刷新
  • public PrintWriter(OutputStream out, boolean autoFlush, Charset charset) 指定字符集且可设置是否自动刷新

注意事项:字符流底层有缓冲区,想要自动刷新需要开启

成员方法

  • public void write(...) :常规方法,用于写出字节或字符串。
  • public void println(Xxx xx) :特有方法,可打印任意类型数据并换行。
  • public void print(Xxx xx) :特有方法,能打印任意类型数据,不换行。
  • public void printf(String format, Object... args) :特有方法,是带有占位符的打印语句 。

代码示例

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;public class printStream {public static void main(String[] args) throws IOException {// 创建对象PrintWriter pw = new PrintWriter(new FileWriter("bbb.txt"),true);// 写出数据pw.println("阿珍爱上了阿强!");pw.print("阿强爱上了阿珍");pw.printf("%s爱上了%s", "阿珍", "阿强");// 释放资源pw.close();}
}

打印流的应用场景

System.out.println("123");

平时用的这个输出语句的完整形式其实是以下样子:

PrintStream ps = System.out;
ps.println("123");

获取打印流的对象,此打印流在虚拟机启动的时候,由虚拟机创建,默认指向控制台

这是特殊的打印流,也叫系统中的标准输出流,是不能关闭的,因为在系统中是唯一的

解压缩/压缩流

解压缩流

ZipInputStream 是 Java 中用于读取 ZIP 文件的输入流,它继承自 InflaterInputStream

解压本质:把压缩包里面的每一个文件或者文件夹读取出来,按照层级拷贝到目的地当中,压缩包里面的每一个文件是一个 ZipEntry 对象,所以也可以说是把每一个 ZipEntry 对象按照层级拷贝到本地另一个文件夹中

构造方法:ZipInputStream(InputStream in):创建一个新的 ZipInputStream,用于从指定的输入流中读取数据。

代码示例:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;public class ZipStreamDemo {public static void main(String[] args) throws IOException {// 创建一个 File 表示要解压的压缩包File src = new File("C:\\aaa.zip");// 创建一个 File 表示解压的目的地File dest = new File("C:\\");unzip(src,dest);}//定义一个方法来解压文件public static void unzip(File src,File dest) throws IOException {// 解压本质:把压缩包里面的每一个文件或者文件夹读取出来,按照层级拷贝到目的地当中// 创建一个解压缩流用来读取压缩包中的数据ZipInputStream zip = new ZipInputStream(new FileInputStream(src));// 先获取到压缩包里面的每一个 zipentry 对象ZipEntry entry;while((entry = zip.getNextEntry()) != null) {System.out.println(entry);if(entry.isDirectory()) {// 文件夹:需要在目的地 dest 处创建一个同样的文件夹File file = new File(dest,entry.toString());file.mkdirs();}else {// 文件:需要读取到压缩包中的文件,并把它存放到目的地 dest 文件夹中(按照层级目录进行存放)FileOutputStream fos = new FileOutputStream(new File(dest,entry.toString()));int b;while((b = zip.read()) != -1) {fos.write(b);}fos.close();// 表示在压缩包中的一个文件处理完毕zip.closeEntry();}}zip.close();}
}

压缩流

ZipOutputStream 用于将数据压缩成 ZIP 格式,它继承自 DeflaterOutputStream

压缩本质:把每一个文件或者文件夹看成一个 ZipEntry 对象放到压缩包中

构造方法:ZipOutputStream(OutputStream out):创建一个新的 ZipOutputStream,将压缩数据写入指定的输出流。

代码示例:

  1. 压缩一个文件
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;public class ZipStreamDemo {public static void main(String[] args) throws IOException {// 创建 File 对象表示要压缩的文件File src = new File("C:\\aaa.txt");// 创建 File 对象表示压缩包的位置File dest = new File("C:\\");toZip(src,dest);}/** 作用:压缩 * 参数一:表示要压缩的文件* 参数二:表示压缩包的位置* */public static void toZip(File src,File dest) throws IOException {// 创建压缩流关联压缩包ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(dest,"aaa.zip")));// 创建 ZipEntry 对象,表示压缩包里的每一个文件和文件夹ZipEntry entry = new ZipEntry("aaa.txt");//把 ZipEntry 对象放到压缩包里zos.putNextEntry(entry);// 把 src 中的数据写到压缩包中FileInputStream fis = new FileInputStream(src);int b;while((b = fis.read()) != -1) {zos.write(b);}zos.closeEntry();zos.close();}
}
  1. 压缩一个文件夹
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;public class ZipStreamDemo {public static void main(String[] args) throws IOException {// 创建 File 对象表示要压缩的文件File src = new File("C:\\aaa");// 创建 File 对象表示压缩包放在哪里(压缩包的父路径)File destParent = src.getParentFile();// 创建 File 对象表示压缩包的位置File dest = new File(destParent,src.getName() + ".zip");// 创建压缩流关联压缩包ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));toZip(src,zos,src.getName());zos.close();}/**  作用:获取 src 里面的每一个文件,变成 ZipEntry 对象,放入压缩包中*  参数一:数据源*  参数二:压缩流*  参数三:压缩包内部的路径* */public static void toZip(File src,ZipOutputStream zos,String name) throws IOException {//1.进入src文件夹File[] files = src.listFiles();//2.遍历数组for (File file : files) {if(file.isFile()){//3.判断-文件,变成ZipEntry对象,放入到压缩包当中ZipEntry entry = new ZipEntry(name + "\\" + file.getName());zos.putNextEntry(entry);//读取文件中的数据,写到压缩包FileInputStream fis = new FileInputStream(file);int b;while((b = fis.read()) != -1){zos.write(b);}fis.close();zos.closeEntry();}else{//4.判断-文件夹,递归toZip(file,zos, name + "\\" + file.getName());}}}
}

Commons-io 工具包

概述

Commons-io 是 apache 开源基金组织提供的一组有关 IO 操作的开源工具包

作用:提高 IO 流的开发效率

Commons-io 的工具包是以 “.jar” 为后缀,所以也叫 jar 包

Commons-io 使用步骤

  1. 在项目中创建名为 “lib” 的文件夹。
  2. 把 jar 包复制粘贴到 “lib” 文件夹。
  3. 右键点击 jar 包,选择 “Add as Library”,然后点击 “OK” 。
  4. 在类中导包使用。

Commons-io 常见方法

FileUtils 类 (文件/文件夹相关)说明
static void copyFile(File srcFile, File destFile)复制文件
static void copyDirectory(File srcDir, File destDir)复制文件夹
static void copyDirectoryToDirectory(File srcDir, File destDir)复制文件夹
static void deleteDirectory(File directory)删除文件夹
static void cleanDirectory(File directory)清空文件夹
static String readFileToString(File file, Charset encoding)读取文件中的数据变成字符串
static void write(File file, CharSequence data, String encoding)写出数据
IOUtils 类(流相关)说明
public static int copy(InputStream input, OutputStream output)复制文件
public static int copyLarge(Reader input, Writer output)复制大文件
public static String readLines(Reader input)读取数据
public static void write(String data, OutputStream output)写出数据

代码示例

import java.io.File;
import java.io.IOException;import org.apache.commons.io.FileUtils;public class commonsio {public static void main(String[] args) throws IOException {File src = new File("C:\\aaa.txt");File dest = new File("C:\\copy.txt");FileUtils.copyFile(src, dest);// 将原文件夹内的内容全部复制到新文件夹内File src = new File("C:\\aaa"); File dest = new File("C:\\bbb");FileUtils.copyDirectory(src, dest);// 将原文件夹直接复制到新文件夹内File src = new File("C:\\aaa"); File dest = new File("C:\\bbb");FileUtils.copyDirectoryToDirectory(src, dest);}
}

关于 Commons-io 工具包的更多使用方法,可以前往 【Apache Commons IO 工具包常用方法】

Hutool 工具包

Hutool 是一个开源的全能型 Java 工具类库,旨在简化 Java 开发中的常见操作,被称为 Java 开发的 “瑞士军刀”。以下是关于它的详细介绍:

  • 特点:
    • 模块化设计:被拆分成多个模块(如 core、crypto、http 等),开发者可按需引入,避免项目依赖臃肿。
    • 简单易用:相比于 Java 原生工具类,其 API 更加简洁,能大幅减少开发者编写的代码量,降低开发成本。
    • 功能全面:涵盖字符串、日期、文件操作、加密、HTTP 请求等开发中几乎所有常见的工具类操作,减少开发者重复造轮子。
  • 常见工具类及功能:
    • 文件操作:FileUtil 类可简化文件的读写、压缩解压、目录管理等操作,如一行代码读取文件内容或递归遍历目录。
    • 日期处理:DateUtil 模块提供丰富的日期工具方法,可进行日期格式化、时间差计算、获取当前时间等操作 。
    • 字符串处理:StrUtil 类让字符串判断、拼接、分割、过滤等操作变得简洁高效。
    • 网络请求:HttpUtil 类支持快速发起 HTTP 请求,支持 GET、POST 等常见操作。
    • 加密解密:SecureUtil 模块提供常见的加密解密算法(如 MD5、AES、RSA 等),满足处理用户密码或敏感数据时的安全需求。
  • 应用场景:适用于企业级项目、微服务开发、第三方接口调用等多种场景,无论是数据处理、文件管理还是网络交互等方面都能发挥作用。
  • 与其他工具库对比:和主要竞争对手 Apache Commons、Guava 相比,Hutool 功能覆盖范围最广;API 设计简洁,使用体验佳;社区较为活跃,更新频繁。不过,Apache Commons 模块化明确,Guava 在集合处理和函数式编程上表现出色,且这两者更新速度虽慢但稳定性更好。
  • 使用注意事项:使用时需按需引入模块;由于版本更新较快,升级时要注意 API 的兼容性;部分复杂操作可能会带来一定性能开销,要根据实际场景权衡;在关键逻辑中,建议掌握 Java 原生工具类,避免过度依赖。

关于 Hutool 工具包的更多使用方法,可以前往 Hutool 官方 进行学习。

相关文章:

【Java】I/O 流篇 —— 打印流与压缩流

目录 打印流概述字节打印流构造方法成员方法代码示例 字符打印流构造方法成员方法代码示例 打印流的应用场景 解压缩/压缩流解压缩流压缩流 Commons-io 工具包概述Commons-io 使用步骤Commons-io 常见方法代码示例 Hutool 工具包 打印流 概述 分类:打印流一般是指…...

更换k8s容器运行时环境为docker

更换k8s容器运行时环境为docker k8s-V1.24之后容器运行时默认是containerd,若想改为熟悉的docker作为运行时,需要做以下操作 在每个节点安装containerd、docker; 每个节点安装cri-docker; 调整kubelet配置并重启验证。 1.安装docker、con…...

【数字信号处理:从原理到应用的深度剖析】

一、数字信号处理的原理 数字信号处理(DSP)是一种通过数学算法对信号进行分析、处理和转换的技术。其核心在于对离散时间信号的操作,目的是提取有用信息或将信号转换为更易于解释的形式。 (一)信号的数字化过程 1. …...

Pytest之fixture的常见用法

文章目录 1.前言2.使用fixture执行前置操作3.使用conftest共享fixture4.使用yield执行后置操作 1.前言 在pytest中,fixture是一个非常强大和灵活的功能,用于为测试函数提供固定的测试数据、测试环境或执行一些前置和后置操作等, 与setup和te…...

FFmpeg入门:最简单的视频播放器

FFmpeg入门:最简单的视频播放器 FFmpeg入门第一篇,制作一个简单的MP4视频播放器。 整体流程 话不多说,直接上流程图 视频播放速率控制 这里可以直接看图中的帧率同步模块,可以分为如下几步 获取到当前帧的预期播放时间&…...

GitHub 语析 - 基于大模型的知识库与知识图谱问答平台

语析 - 基于大模型的知识库与知识图谱问答平台 GitHub 地址:https://github.com/xerrors/Yuxi-Know 📝 项目概述 语析是一个强大的问答平台,结合了大模型 RAG 知识库与知识图谱技术,基于 Llamaindex VueJS FastAPI Neo4j 构…...

Linux《基础开发工具(上)》

在之前的篇章当中我们已经了解了Linux当中基本的指令以及相关的知识,那么接下来在本篇当中就开始学基本的开发工具,在此我们一共要了解6大开发工具,在此将这些工具的学习分为上中下篇,在本篇当中我们首先要来学习的是yun以及vim,一…...

【考试大纲】初级信息系统运行管理员考试大纲

目录 引言一、考试要求1、 考试说明2、 考试要求3、 本考试设置的科目包括:二、考试范围考试科目1:信息系统基础知识(初级)考试科目2:信息系统运行管理(应用技术)引言 最新的信息系统运行管理员考试大纲出版于 2018 年 9 月,本考试大纲基于此版本整理。 一、考试要求…...

《每天搞懂一道Hard》之数独终结者(LeetCode 37)

📌《每天搞懂一道Hard》之数独终结者(LeetCode 37) 🔗原题链接:https://leetcode.com/problems/sudoku-solver/ 今天我们来解剖一个经典回溯算法问题——数独求解器!这道题在算法面试中出现频率高达35%&a…...

LangChain原理解析及开发实战指南(2025年最新版)

一、LangChain核心架构解析 1.1 框架设计理念 LangChain是基于提示工程(Prompt Engineering)构建的LLM应用开发框架,其核心思想是通过模块化组件实现大语言模型与业务系统的无缝对接。该框架采用分层设计: 接口层:统一对接OpenAI、DeepSee…...

YoloV8改进策略:Block改进|CBlock,Transformer式的卷积结构|即插即用

摘要 论文标题: SparseViT: Nonsemantics-Centered, Parameter-Efficient Image Manipulation Localization through Spare-Coding Transformer 论文链接: https://arxiv.org/pdf/2412.14598 官方GitHub: https://github.com/scu-zjz/SparseViT 这段代码出自SparseViT ,代码如…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_open_file

ngx_open_file 定义在src/os/unix/ngx_files.h #define ngx_open_file(name, mode, create, access) \open((const char *) name, mode|create, access)#define NGX_FILE_RDONLY O_RDONLY #define NGX_FILE_WRONLY O_WRONLY #de…...

测试金蝶云的OpenAPI

如何使用Postman测试K3Cloud的OpenAPI 1. 引言 在本篇博客中,我将带你逐步了解如何使用Postman测试和使用K3Cloud的OpenAPI。内容包括下载所需的SDK文件、配置文件、API调用及测试等步骤。让我们开始吧! 2. 下载所需的SDK文件 2.1 获取SDK 首先&…...

C语言408考研先行课第一课:数据类型

由于408要考数据结构……会有算法题…… 所以,需要C语言来进行一个预备…… 因为大一贪玩,C语言根本没学进去……谁能想到考研还用得到呢?【手动doge(bushi) 软件用的是Clion,可以自行搜索教程下载使用。…...

11天 -- Redis 中跳表的实现原理是什么?Redis 的 hash 是什么?Redis Zset 的实现原理是什么?

Redis 中跳表的实现原理是什么? Redis 中的跳表(Skip List)是一种基于有序链表的高效数据结构,通过在链表上增加多级索引来提高数据的查找效率。以下是 Redis 中跳表的实现原理: 1. 基本概念 节点结构:跳…...

单细胞分析(19)—— 单细胞转录组基因集评分方法

下面是每种基因集评分方法的原理介绍代码示例,适用于R语言和Python两种主流生信分析环境。可以直接应用于单细胞转录组(scRNA-seq)数据分析中。 🔬 单细胞转录组基因集评分方法(附代码示例) 在单细胞RNA测…...

010 rocketmq批量消息

文章目录 批量消息BatchProducer.javaBatchConsumer.java 批量消息 批量发送可以提⾼发送性能,但有⼀定的限制: topic 相同 waitStoreMsgOK 相同 (⾸先我们建设消息的iswaitstoremsgoktrue(默认为true), 如果没有异常,我们将始终收到"O…...

JavaWeb后端基础(3)

原打算把Mysql操作数据库的一些知识写进去,但是感觉没必要,要是现在会的都是简单的增删改查,所以,这一篇,我直接从java操作数据库开始写,所以这一篇大致就是记一下JDBC、MyBatis、以及SpringBoot的配置文件…...

Oracle数据库基础入门(三): DQL 深入解析与实践

在 Oracle 数据库的知识体系中,数据查询语言(DQL)无疑是最为常用且关键的部分之一。对于 Java 全栈开发者而言,熟练掌握 DQL 不仅能高效地从数据库中获取所需数据,更是构建强大后端应用的基石。通过 DQL,我…...

P9231 [蓝桥杯 2023 省 A] 平方差

P9231 [蓝桥杯 2023 省 A] 平方差 - 洛谷 题目描述 给定 L,R,问 L≤x≤R 中有多少个数 x 满足存在整数 y,z 使得 xy2−z2。 输入格式 输入一行包含两个整数 L,R,用一个空格分隔。 输出格式 输出一行包含一个整数满足题目给定条件的 x 的数量。 输…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层&#xf…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息&#xff0…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

React核心概念:State是什么?如何用useState管理组件自己的数据?

系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...