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
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
相关文章推荐
- Struts之文件上传
- java 反射api的功能详解
- java hdu 2082
- Java反射技术概述
- Java――JavaWeb项目开发的总结
- 如何在已安装有jdk的环境下安装高版本jdk
- Java正则表达式进阶(二):简单查询域名的Whois信息
- Java毕业设计之简单易懂计算器+源代码+注释
- java.lang.OutOfMemoryError: GC overhead limit exceeded解决
- AES加密/解密 IOS 端,JAVA端 通用,不限明文字符长度
- Java基础之详解Thread与Runnable
- Java正则表达式进阶(一):写出常用的正则模式
- java中文乱码转码不成功、pl/sql数据库中文乱码、get提交方式中文乱码
- Java中Scanner类方法简介
- JAVA 大数相乘
- Java实现监听USB插入
- 如何搭建struts框架
- eclipse的某些设置及快捷键
- Java源码剖析之server2008上拉不出验证码
- 【struts2】Result和ResultType