Java IO 之 ZipFile/ZipInputStream/ZipOutputStream

进行文件操作时,一般的步骤如下:

读操作:对目标文件 new 一个输入流      —>       读取数据      —>      操作数据

写操作:对目标文件 new 一个输出流      —>       调用write方法写入数据   


了解Java压缩技术首先应该了解Zip文件的结构,如下图,一个zip文件包含了多个ZipEntry,称之为“条目”。



zip文件的操作和普通文件的操作是类似的,唯一的区别是zip文件的数据结构不同,zip文件是个容器,包含多个文件。因此对zip文件的读写就是对容器内文件的读写。

读操作:对目标zip文件 new 一个zip输入流      —>      对于每个条目,为该条目new一个文件输入流,读取条目数据     —>      操作数据

写操作:对目标zip文件 new 一个zip输出流      —>      对于每个条目,为该条目new一个文件输出流,然后写入数据   



读操作的代码:

@Test
public void runZipInputStream() throws IOException {
	//1. 创建zip输入流
	ZipInputStream zin = new ZipInputStream(new FileInputStream("IOTest.zip"));
	ZipEntry ze;
	
	//2. 逐个处理条目
	while ((ze = zin.getNextEntry()) != null) {
		//测试: 输出条目的信息
		System.out.printf("条目信息: 名称%1$b, 大小%2$d, 压缩时间%3$d \n", ze.getName(), ze.getSize(), ze.getTime());
		
		//3. 操作文件内容-输出、处理
		FileInputStream fin = new FileInputStream(ze.getName());
		byte[] buffer = new byte[4096];
		int len;
		while ((len = fin.read(buffer)) != -1) {
			System.out.print(new String(buffer, 0, len));
		}
	}
}

写操作代码:

@Test
public void runZipOutputStream() throws IOException {
	//1. 创建zip输出流
	ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("javaio.rar"));
	
	//2. 创建并设置条目信息
	File f = new File("javaio.bmp");
	ZipEntry ze = new ZipEntry(f.getName());
	ze.setComment("Hello, Zip");
	ze.setSize(f.length());
	ze.setTime(f.lastModified());
	
	//3. 添加条目到输出流
	zos.putNextEntry(ze);
	
	//4. 输出
	FileInputStream fin = new FileInputStream(f);
	byte[] buffer = new byte[4096];
	int len;
	while ((len = fin.read(buffer)) != -1) {
		zos.write(buffer, 0, len);
	}
	fin.close();
	
	//5. 关闭流
	zos.close();
}

上面的代码都是对单个文件进行操作,如果要压缩整个目录,就需要遍历目录下的所有文件。







你可能感兴趣的:(Java)