直接用gzipoutputstream包裹fileoutputstream可压缩写入大文本文件,需显式设置8kb缓冲区、分块写入、确保close()调用以写入压缩尾部,并用try-with-resources保证资源正确释放。

直接用 GZIPOutputStream 包裹 FileOutputStream 就能压缩写入大文本文件,关键在于合理控制缓冲区、及时刷新和正确关闭资源,避免内存溢出或文件损坏。
基础写法:GZIPOutputStream 套接 FileOutputStream
这是最常用的方式,GZIPOutputStream 会自动对写入的数据进行 GZIP 压缩:
try (FileOutputStream fos = new FileOutputStream("data.txt.gz");
GZIPOutputStream gzos = new GZIPOutputStream(fos)) {
String content = "一大段文本内容..."; // 或逐行/分块写入
gzos.write(content.getBytes(StandardCharsets.UTF_8));
} catch (IOException e) {
e.printStackTrace();
}
注意:GZIPOutputStream 默认使用 512 字节缓冲区,对大文件效率偏低,建议显式指定更大的缓冲区(如 8KB):
new GZIPOutputStream(fos, 8192)
处理超大文本:分块写入 + 避免内存堆积
不要一次性把整个大文件读进内存再写,而是边读边压。例如从 BufferedReader 读取文本,按行或按固定大小(如 4KB)写入:
- 用
InputStreamReader+BufferedReader读源文件,避免乱码 - 每次读取一行或
char[]数组,转成byte[]后写入GZIPOutputStream - 不需要手动调用
flush(),但务必确保close()被调用——它会完成压缩尾部(gzip trailer)
确保压缩完整性:别漏掉 close() 和异常处理
GZIPOutputStream.close() 不仅释放资源,还会写入压缩结束标记(CRC、ISIZE 等)。如果只 flush() 不 close(),生成的 .gz 文件无法被标准工具解压。
推荐始终用 try-with-resources,它能保证即使发生异常也会执行 close():
try (FileInputStream fis = new FileInputStream("input.txt");
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
BufferedReader reader = new BufferedReader(isr);
FileOutputStream fos = new FileOutputStream("output.txt.gz");
GZIPOutputStream gzos = new GZIPOutputStream(fos, 8192)) {
String line;
while ((line = reader.readLine()) != null) {
gzos.write(line.getBytes(StandardCharsets.UTF_8));
gzos.write('\n'); // 补回换行符
}
} catch (IOException e) {
// 处理 IO 异常
}
验证压缩结果是否可用
生成后可快速验证:
- 用系统命令
gzip -t output.txt.gz检查完整性 - Java 中用
GZIPInputStream尝试读取前几 KB,看是否抛异常 - 注意:.gz 文件比原始文本小很多(通常 20%~30%),但不会为零——若大小接近 20 字节,说明没写入数据或提前关闭了流
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











