进行文件操作时,一般的步骤如下:
读操作:对目标文件 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(); }
上面的代码都是对单个文件进行操作,如果要压缩整个目录,就需要遍历目录下的所有文件。