您的位置:首页 > 编程语言 > Java开发

Java压缩文件

2015-11-25 13:26 288 查看
    使用Java来压缩文件,主要用到2个类,一个是java.util.zip.ZipEntry一个是java.util.zip.ZipOutputStream,用的是Java自带的压缩类,自带的类不能设置编码,有时会出现乱码的现象,所以可以使用apache的压缩类,它的可以设置编码,由于用法差不多,所以这里讲的是Java自带的

    ZipOutputStream:代表了一个zip格式的输出流,操作与普通输出流一样

    ZipEntry:代表了zip文件中的一个目录

    下面这个程序就是简单的将一个文件压缩成zip格式的文件

public static void main(String[] args) throws IOException {
File srcFile = new File("F:\\test\\1.doc");
File tarFile = new File("F:\\test\\1.zip");
ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(tarFile));
BufferedInputStream in = new BufferedInputStream(new FileInputStream(srcFile));
zipOut.putNextEntry(new ZipEntry(srcFile.getName()));
byte[] buffer = new byte[1024];
int b = 0;
while ((b = in.read(buffer)) != -1) {
zipOut.write(buffer);
}
zipOut.close();
in.close();
}    test文件夹里会生成一个zip文件

    看了代码,就是普通的IO操作类似,不过这里多了一步操作,就是 zipOut.putNextEntry(new ZipEntry(srcFile.getName()));
    可以理解为在zip文件中生成名字为1.doc的文件,也就是生成zip文件后,打开zip文件后里面有一个1.doc的文件

    如果ZipEntry中的参数为 "目录1/目录1中的文件.doc",那么将生成如下结构

    也就是这个参数的就代表了文件的结构的父子关系,只要如果

    注意:如果该参数最后是以"/"结尾,那么就是一个文件夹,即上面的参数变成"目录1/目录1中的文件.doc/",那么目录1下的就不是一个doc文件了,而是一个名为"目录1中的文件.doc"的文件夹

    所以压缩文件最重要的一点就是设置了这个ZipEntry的参数,他代表了文件的结构,如果错了,那么生成的zip文件中的结构就不对了

    下面是自己写了一个压缩的代码,可以压缩文件和文件夹

public static void main(String[] args) throws IOException {
File srcFile = new File("F:\\test\\1.doc");
File tarFile = new File("F:\\test\\1.zip");
zip(srcFile, tarFile);
}

/**
* @param srcFile
* 需要压缩的文件的File对象
* @param tarFile
* 压缩好的文件的File对象
* @throws IOException
*/
public static void zip(File srcFile, File tarFile) throws IOException {
ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(tarFile));
zip(srcFile, tarFile, srcFile.getName(), zipOut);
zipOut.close();
}

/**
* @param srcFile
* 需要压缩的文件的File对象
* @param tarFile
* 压缩好的文件的File对象
* @param baseFileName
* 父级目录名
* @param zipOut
* ZipOutputStream对象
* @throws IOException
*/
public static void zip(File srcFile, File tarFile, String baseFileName, ZipOutputStream zipOut) throws IOException {
System.out.println(baseFileName);
if (srcFile.isDirectory()) {// 如果是目录,遍历文件
File[] files = srcFile.listFiles();
if (files.length == 0) {//如果没有子目录,那么在zip文件中设置为文件夹
zipOut.putNextEntry(new ZipEntry(baseFileName + "/"));
}
for (int i = 0; i < files.length; i++) {
zip(files[i], tarFile, baseFileName + "/" + files[i].getName(), zipOut);
}
} else {
BufferedInputStream in = new BufferedInputStream(new FileInputStream(srcFile));
// 在zip文件中创建目录
zipOut.putNextEntry(new ZipEntry(baseFileName));
byte[] buffer = new byte[1024];
int b = 0;
while ((b = in.read(buffer)) != -1) {
zipOut.write(buffer);
}
zipOut.flush();
}
}
    输入输出没什么好说的,就是简单的IO操作,麻烦的是需要设置好文件目录,这一点是递归实现的

    另外,这篇文章写了有关压缩的知识,可以去看下
http://blog.csdn.net/hanshileiai/article/details/6718375
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: