Java IO 之 ZipFile/ZipInputStream/ZipOutputStream

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

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

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


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

Java IO 之 ZipFile/ZipInputStream/ZipOutputStream


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

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

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

Java IO 之 ZipFile/ZipInputStream/ZipOutputStream


读操作的代码:

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

写操作代码:
[java]  view plain copy
  1. @Test   
  2. public void runZipOutputStream() throws IOException {  
  3.     //1. 创建zip输出流  
  4.     ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("javaio.rar"));  
  5.       
  6.     //2. 创建并设置条目信息  
  7.     File f = new File("javaio.bmp");  
  8.     ZipEntry ze = new ZipEntry(f.getName());  
  9.     ze.setComment("Hello, Zip");  
  10.     ze.setSize(f.length());  
  11.     ze.setTime(f.lastModified());  
  12.       
  13.     //3. 添加条目到输出流  
  14.     zos.putNextEntry(ze);  
  15.       
  16.     //4. 输出  
  17.     FileInputStream fin = new FileInputStream(f);  
  18.     byte[] buffer = new byte[4096];  
  19.     int len;  
  20.     while ((len = fin.read(buffer)) != -1) {  
  21.         zos.write(buffer, 0, len);  
  22.     }  
  23.     fin.close();  
  24.       
  25.     //5. 关闭流  
  26.     zos.close();  
  27. }  

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







分享到: 

你可能感兴趣的:(Java IO 之 ZipFile/ZipInputStream/ZipOutputStream)