欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > 【Java】I/O 流篇 —— 打印流与压缩流

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

2025/5/7 15:33:40 来源:https://blog.csdn.net/m0_72516377/article/details/145892786  浏览:    关键词:【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 官方 进行学习。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词