Java处理Zip文件
最近做的一个项目需要用Java 程序读写Zip 文件,迫于找不到好的工具类来处理,也只好用java.util.zip 包提供的类来实现Zip 文件的压缩和解压操作了,在这之前你需要了解以下几个基本概念:
- ZipEntry :This class is used to represent a ZIP file entry.
- ZipFile :This class is used to read entries from a zip file.
- ZipInputStream :This class implements an input stream filter for reading files in the ZIP file format.
- ZipOutputStream :This class implements an output stream filter for writing files in the ZIP file format.
现在我们了解一下读写Zip 文件的基本流程。当解压时,从该Zip 文件输入流中读取出ZipEntry ,然后根据ZipEntry 的信息,读取对应文件的相应字节。代码实现如下:
public synchronized static Map<String, byte []> unZip(InputStream is)
throws IOException {
Map<String, byte []> result = new HashMap<String, byte []>();
byte [] buf;
ZipInputStream zis = new ZipInputStream(is);
ZipEntry zipEntry = zis.getNextEntry();
while (zipEntry != null ) {
if (zipEntry .isDirectory()) {
zipEntry = zis.getNextEntry();
continue ;
} else {
buf = new byte [( int ) zipEntry .getSize()];
zis.read(buf, 0, ( int ) zipEntry .getSize());
result.put(zipEntry .getName(), buf);
zipEntry = zis.getNextEntry();
}
}
return result;
}
压缩操作与解压操作差不多,先将文件字节流组装成ZipEntry ,然后把ZipEntry 加入到输出流中即可。代码实现如下:
public synchronized static ByteArrayOutputStream zip(Map<String, byte []> map)
throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
ZipEntry zipEntry ;
for (String key : map.keySet()) {
zipEntry = new ZipEntry (key);
zipEntry .setSize(map.get(key). length );
zipEntry .setTime(System.currentTimeMillis ());
zos.putNextEntry(zipEntry );
zos.write(map.get(key));
zos.flush();
}
zos.close();
return baos;
}
至此,使用上面的两个方法就能完成基本的 Zip 文件压缩和解压缩处理了;该方法只适合处理 Zip 格式的文件,对于 GZip 格式的文件,我相信你也能轻松搞定了:)。