java中经常使用ZipOutStream进行文件的压缩,用ZipInputStream对文件进行解压,zip相对于其余的文件的io稍有一点点不一样的就是:它的内部就是一个小型的文件系统。若是是一个文件夹全部文件都是文档二不是文件夹。那还好办直接操做。若是涉及到文件夹和文档的不固定分布。那就须要仔细考虑下。这里用递归进行遍历。java
主要两个方法:缓存
这里面重要的就是ZipEntry这个概念首先要懂。ZipEntry是zip下面的文件条目,你能够比做外面系统的File相似。后面的参数就是在zip目录下的相对位置。因此这里有一点比较重要的就是当你遍历文件夹的时候你的ZipEntry的参数的改变规律。写很差的话会使整个文件目录混乱(若是文件层级较低那就不碍事)。而putNextEntry(ZipEntry z)的意思就是我下面io操做(写入)都是在z这个文件条目下进行的。函数
这个zipoutputstream流和其余的output流不同的地方就是BufferedOutputStream不能嵌套它。也就是它不能套缓存流用。spa
对于文件夹下包含文件夹须要特殊考虑。判断它是否是文件夹。文件夹的话要遍历他的子节点文件。用递归思想。已在代码中给出注释。还有文件要注意相对绝对路径。code
贴上个人模板代码:cdn
import java.io.BufferedInputStream;
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.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class test1 {
public static void main(String[] args) throws IOException {
String filepath="F:\\fileget\\二班";//目标文件夹
String zipname="F:\\fileget\\二班软工做业.zip";//目标输出路径
filetozip(filepath,zipname);
}
public static void filetozip(String filepath,String zipname) throws IOException {
File file=new File(filepath);
OutputStream outputStream=new FileOutputStream(zipname);
ZipOutputStream zipout=new ZipOutputStream(outputStream);
//递归函数 三个参数分别表明 1:当前zipout流 2:当前文件/文件夹 3:在zip下的path
dozip(zipout,file,"");
zipout.finish();
zipout.close();
outputStream.close();
}
private static void dozip(ZipOutputStream zipout, File file, String addpath) throws IOException {
if(file.isDirectory())//若是是个文件夹
{
File f[]=file.listFiles();
for(int i=0;i<f.length;i++)
{
//若是是个文件夹 后面要加“/”由于它会遍历下层
if(f[i].isDirectory()) {
dozip(zipout, f[i], addpath+f[i].getName()+"/");
}//若是是文件,执行dozip下一次判断它不是文件夹就会进行压缩
else {
dozip(zipout, f[i], addpath+f[i].getName());
}
}
}
else//不是文件夹,是文件
{
InputStream input;
BufferedInputStream buff;
//初始为"",意味不找下级就是("xxx.doc"),若是不是顶级目录层就("xx/yy/x.doc")
zipout.putNextEntry(new ZipEntry(addpath+file.getName()));
input=new FileInputStream(file);
buff=new BufferedInputStream(input);
byte b[]=new byte[1024*5];
int a=0;
while((a=buff.read(b))!=-1)
{
zipout.write(b);
}
buff.close();
input.close();
System.out.println(file.getName());
}
}
}
复制代码