首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java压缩和好压缩Zip、Jar、Gzip文件

2012-10-06 
java压缩和解压缩Zip、Jar、Gzip文件我们经常会使用WinZIP等压缩软件将文件进行压缩以方便传输。在java里面也

java压缩和解压缩Zip、Jar、Gzip文件

我们经常会使用WinZIP等压缩软件将文件进行压缩以方便传输。在java里面也提供了将文件进行压缩以减少传输时的数据量的类,可以很方便的将文件压缩成ZIP、JAR、GZIP等形式,GZIP主要是在Linux系统下的压缩文件。

下面主要讲的就是ZIP形式的压缩文件,而JAR、GZIP形式的压缩文件也是类似的用法。

ZIP是一种很常见的压缩形式,在java中要实现ZIP的压缩主要用到的是java.util.zip这个包里面的类。主要有ZipFile、ZipOutputStream、ZipInputStream和ZipEntry。ZipOutputStream是用来压缩文件的,ZipInputStream和ZipFile是用来解压缩文件的,在压缩和解压缩的过程中,ZipEntry都会用到。在java的Zip压缩文件中,每一个子文件都是一个ZipEntry对象。

?

压缩文件:

?

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.nio.charset.Charset;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;public class ZipOutputStreamTest {public static void main(String args[]) throws IOException {test1();test2();}public static void test1() throws IOException {ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("D:\\testZip.zip"), Charset.forName("GBK"));//实例化一个名称为ab.txt的ZipEntry对象ZipEntry entry = new ZipEntry("ab.txt");//设置注释zos.setComment("zip测试for单个文件");//把生成的ZipEntry对象加入到压缩文件中,而之后往压缩文件中写入的内容都会放在这个ZipEntry对象里面zos.putNextEntry(entry);InputStream is = new FileInputStream("D:\\ab.txt");int len = 0;while ((len = is.read()) != -1)zos.write(len);is.close();zos.close();}public static void test2() throws IOException {File inFile = new File("D:\\test");ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("D:\\test.zip"), Charset.forName("GBK"));zos.setComment("多文件处理");zipFile(inFile, zos, "");zos.close();}//压缩文件public static void zipFile(File inFile, ZipOutputStream zos, String dir) throws IOException {if (inFile.isDirectory()) {File[] files = inFile.listFiles();for (File file:files)zipFile(file, zos, dir + "\" + inFile.getName());} else {String entryName = null;if (!"".equals(dir))entryName = dir + "\" + inFile.getName();elseentryName = inFile.getName();ZipEntry entry = new ZipEntry(entryName);zos.putNextEntry(entry);InputStream is = new FileInputStream(inFile);int len = 0;while ((len = is.read()) != -1)zos.write(len);is.close();}}}

?

解压缩文件:?

?

?

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.nio.charset.Charset;import java.util.Enumeration;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;import java.util.zip.ZipInputStream;public class ZipInputStreamTest {public static void main(String args[]) throws IOException {File file = new File("D:\\test.zip");//压缩文件ZipFile zipFile = new ZipFile(file, Charset.forName("GBK"));//实例化ZipFile,并指定其编码格式,防止中文乱码和解压错误,每一个zip压缩文件都可以表示为一个ZipFile//实例化一个Zip压缩文件的ZipInputStream对象,可以利用该类的getNextEntry()方法依次拿到每一个ZipEntry对象ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(file), Charset.forName("GBK"));//直接利用ZipFile进行解压unpack(zipFile);//利用ZipFile和ZipInputStream进行解压unpack(zipFile, zipInputStream);}/** * 该方法是通过ZipFile和ZipInputStream共同来解压文件的,通过ZipInputStream可以拿到ZipFile中的每一个 * ZipEntry对象,然后通过ZipFile的getInputStream(ZipEntry zipEntry)方法拿到对应的每一个ZipEntry的 * 输入流,从而实现文件的解压 * @param zipFile * @param zipInputStream * @throws IOException */public static void unpack(ZipFile zipFile, ZipInputStream zipInputStream) throws IOException {ZipEntry zipEntry = null;while ((zipEntry = zipInputStream.getNextEntry()) != null) {String fileName = zipEntry.getName();File temp = new File("D:\\unpackTest\" + fileName);if (! temp.getParentFile().exists())temp.getParentFile().mkdirs();OutputStream os = new FileOutputStream(temp);//通过ZipFile的getInputStream方法拿到具体的ZipEntry的输入流InputStream is = zipFile.getInputStream(zipEntry);int len = 0;System.out.println(zipEntry.getName());while ((len = is.read()) != -1)os.write(len);os.close();is.close();}zipInputStream.close();}/** * 该方法是直接通过ZipFile的entries()方法拿到包含所有的ZipEntry对象的Enumeration对象, * 接下来的操作和上面的是一样的 * @param zipFile * @throws IOException */public static void unpack(ZipFile zipFile) throws IOException {Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zipFile.entries();while (entries.hasMoreElements()) {ZipEntry zipEntry = entries.nextElement();String fileName = zipEntry.getName();File temp = new File("D:\\unpackTest2\" + fileName);if (! temp.getParentFile().exists())temp.getParentFile().mkdirs();OutputStream os = new FileOutputStream(temp);//通过ZipFile的getInputStream方法拿到具体的ZipEntry的输入流InputStream is = zipFile.getInputStream(zipEntry);int len = 0;while ((len = is.read()) != -1)os.write(len);os.close();is.close();}}}
?

?

?

?

?

?

怎么我运行不了的呢? 怎么我运行不了的呢?
哪里运行不了,有什么问题呢?我运行是没有问题的 3 楼 dying 2012-05-05   ZipOutputStream有你那个构造方法?我在API上只看到一个构造方法ZipOutputStream(OutputStream out)
不知道哪里转来的,也不看下 4 楼 234390216 2012-05-05   dying 写道ZipOutputStream有你那个构造方法?我在API上只看到一个构造方法ZipOutputStream(OutputStream out)
不知道哪里转来的,也不看下
源码里面是有public ZipOutputStream(OutputStream out, Charset charset) {}这个构造方法的,这个构造方法API里面确实没有写出来,像你说的那个构造方法默认使用的字符编码是UTF-8,当需要指定字符编码的时候就需要用public ZipOutputStream(OutputStream out, Charset charset) {}这个构造方法了,关于这两个构造方法你可以查看ZipOutputStream的源码得到你想要的答案。 5 楼 alex295111 2012-06-02   这个要jdk1.7才有
大家可以参考:
https://blogs.oracle.com/xuemingshen/entry/non_utf_8_encoding_in

热点排行