压缩与解压缩的流

!!! note 目录

压缩与解压缩的流

一、.gz压缩与解压缩流

1.1 GZIPInputStream

描述
GZIPInputStream用于读取GZIP格式的压缩数据,它解压从一个基础输入流读取的字节。

构造方法

构造方法 描述
GZIPInputStream(InputStream in) 创建一个使用默认缓冲区大小的GZIP输入流。
GZIPInputStream(InputStream in, int size) 创建一个使用指定缓冲区大小的GZIP输入流。

常用方法

方法 描述
int read(byte[] buf, int off, int len) 从GZIP输入流中读取解压后的数据到缓冲区中。
void close() 关闭GZIP输入流并释放所有相关的系统资源。

1.2 GZIPOutputStream

描述
GZIPOutputStream用于将数据压缩成GZIP格式,并写入到一个基础输出流中。

构造方法

构造方法 描述
GZIPOutputStream(OutputStream out) 创建一个使用默认缓冲区大小的GZIP输出流。
GZIPOutputStream(OutputStream out, int size) 创建一个使用指定缓冲区大小的GZIP输出流。

常用方法

方法 描述
void write(byte[] buf, int off, int len) 将数据写入GZIP输出流进行压缩。
void finish() 完成写入压缩数据,但不关闭输出流。
void close() 关闭GZIP输出流并释放所有相关的系统资源。

1.3 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package com.camellia.io.CompressionDecompression;

import org.junit.jupiter.api.Test;

import java.io.*;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

/**
* 该类包含使用GZIP格式压缩和解压缩文件的测试方法。
*/
public class GZIPInputOutputStreamTest {

/**
* 测试GZIP文件的解压缩。
* 读取一个GZIP压缩的PDF文件,并将解压后的内容写入一个新的PDF文件。
*/
@Test
public void testGZIPInputStream() {
try (
// 创建一个GZIP输入流,从压缩文件读取数据
GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("src/document/C程序设计(第五版) (谭浩强) (Z-Library).pdf.gz"));
// 创建一个文件输出流,将解压后的内容写入新的文件
FileOutputStream out = new FileOutputStream("src/document/C程序设计(第五版) (谭浩强) (Z-Library).pdf")
) {
byte[] buffer = new byte[1024];
int bytesRead;

// 从GZIP输入流读取数据并写入文件输出流
while ((bytesRead = gzip.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
// 节点流关闭时会自动刷新,而包装流需要手动刷新
} catch (FileNotFoundException e) {
// 处理指定文件未找到的情况
e.printStackTrace();
} catch (IOException e) {
// 处理一般的I/O异常
e.printStackTrace();
}
}

/**
* 测试文件的GZIP压缩。
* 读取一个PDF文件,并将压缩后的内容写入一个新的GZIP文件。
*/
@Test
public void testGZIPOutputStream() {
try (
// 创建一个文件输入流,从原始文件读取数据
FileInputStream in = new FileInputStream("E:\\桌面临时缓存\\C程序设计(第五版) (谭浩强) (Z-Library).pdf");
// 创建一个GZIP输出流,将数据写入压缩文件
GZIPOutputStream gzip = new GZIPOutputStream(new FileOutputStream("src/document/C程序设计(第五版) (谭浩强) (Z-Library).pdf.gz"))
) {
byte[] buffer = new byte[1024];
int bytesRead;

// 从文件输入流读取数据并写入GZIP输出流
while ((bytesRead = in.read(buffer)) != -1) {
gzip.write(buffer, 0, bytesRead);
}

// 调用finish()方法非常重要,以确保所有数据被刷新并最终生成压缩文件
gzip.finish();
} catch (FileNotFoundException e) {
// 处理指定文件未找到的情况
e.printStackTrace();
} catch (IOException e) {
// 处理一般的I/O异常
e.printStackTrace();
}
}
}

二、.zip压缩与解压缩流

2.1 ZipOutputStream

描述
ZipOutputStream用于创建ZIP文件,并将多个文件压缩成单个ZIP文件。

构造方法

构造方法 描述
ZipOutputStream(OutputStream out) 创建一个使用指定输出流的ZIP输出流。

常用方法

方法 描述
void putNextEntry(ZipEntry e) 开始编写新的ZIP文件条目并定位流到条目数据的开始。
void closeEntry() 完成当前ZIP条目的写入。
void write(byte[] buf, int off, int len) 将数据写入当前ZIP条目。
void finish() 完成写入压缩数据,但不关闭输出流。
void close() 关闭ZIP输出流并释放所有相关的系统资源。

2.2 ZipInputStream

描述
ZipInputStream用于读取ZIP文件,并从中解压多个文件。

构造方法

构造方法 描述
ZipInputStream(InputStream in) 创建一个使用指定输入流的ZIP输入流。

常用方法

方法 描述
ZipEntry getNextEntry() 定位流到下一个ZIP条目并返回该条目。
void closeEntry() 关闭当前ZIP条目并定位流到下一个条目。
int read(byte[] buf, int off, int len) 从当前ZIP条目中读取解压后的数据到缓冲区中。
void close() 关闭ZIP输入流并释放所有相关的系统资源。

2.3 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package com.camellia.io.CompressionDecompression;

import org.junit.jupiter.api.Test;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/**
* 该类包含使用ZIP格式压缩和解压缩文件的测试方法。
*/
public class ZipInputOutputStreamTest {
// 源文件路径
private String sourceFilePath = "E:\\桌面临时缓存\\C程序设计(第五版) (谭浩强) (Z-Library).pdf";
// ZIP压缩文件路径
private String zipFilePath = "src/document/C程序设计(第五版) (谭浩强) (Z-Library).pdf.zip";
// 解压后的文件路径
private String extractedFilePath = "src/document/C程序设计(第五版) (谭浩强) (Z-Library) - extracted.pdf";

/**
* 测试ZIP文件的压缩。
* 读取一个PDF文件,并将压缩后的内容写入一个新的ZIP文件。
*/
@Test
public void testZipOutputStream() {
try (
// 创建文件输入流读取源文件
FileInputStream fis = new FileInputStream(sourceFilePath);
// 创建ZIP输出流写入压缩文件
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFilePath))
) {
// 创建一个新的ZIP条目
ZipEntry zipEntry = new ZipEntry(new File(sourceFilePath).getName());
zos.putNextEntry(zipEntry);

// 读取文件的缓冲区
byte[] buffer = new byte[1024];
int bytesRead;

// 将文件写入ZIP
while ((bytesRead = fis.read(buffer)) != -1) {
zos.write(buffer, 0, bytesRead);
}

// 关闭当前条目
zos.closeEntry();
} catch (FileNotFoundException e) {
// 处理指定文件未找到的情况
e.printStackTrace();
} catch (IOException e) {
// 处理一般的I/O异常
e.printStackTrace();
}
}

/**
* 测试ZIP文件的解压缩。
* 读取一个ZIP压缩的文件,并将解压后的内容写入一个新的文件。
*/
@Test
public void testZipInputStream() {
try (
// 创建ZIP输入流读取压缩文件
ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath));
// 创建文件输出流写入解压后的文件
FileOutputStream fos = new FileOutputStream(extractedFilePath)
) {
// 获取ZIP中的第一个条目
ZipEntry zipEntry = zis.getNextEntry();

// 读取文件的缓冲区
byte[] buffer = new byte[1024];
int bytesRead;

// 将文件内容写入输出流
while ((bytesRead = zis.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}

// 关闭当前条目
zis.closeEntry();
} catch (FileNotFoundException e) {
// 处理指定文件未找到的情况
e.printStackTrace();
} catch (IOException e) {
// 处理一般的I/O异常
e.printStackTrace();
}
}
}