有个朋友在我之前写的一个压缩文件里问:我这边是一个文件夹下面还有多个文件夹,像这样的怎么处理?
对于这样的问题我想到的是递归方式,为一级文件夹下面的每个文件进行判断是文件夹还是文件!
下面是详细的代码:
下面我们要对上面的情况进行压缩,代码如下:
public static void main(String[] args) throws Exception {
String entry = "C:\\Users\\yutao\\Desktop\\pageage\\test";//需要压缩的文件目录
File file = new File(entry);
ZipOutputStream zipOutput = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(file.getAbsolutePath() + ".zip")));
String base = file.getName();
compressZip(zipOutput, file, base);
zipOutput.closeEntry();
zipOutput.close();
}
/**
* 因为子文件夹中可能还有文件夹,所以进行递归
*
*/
private static void compressZip(ZipOutputStream zipOutput, File file, String base) throws IOException {
if(file.isDirectory()){
File[] listFiles = file.listFiles();// 列出所有的文件
for(File fi : listFiles){
if(fi.isDirectory()){
compressZip(zipOutput, fi, base + "/" + fi.getName());
}else{
zip(zipOutput, fi, base);
}
}
}else{
zip(zipOutput, file, base);
}
}
/**
* 压缩的具体操作
*
*/
public static void zip(ZipOutputStream zipOutput, File file, String base) throws IOException, FileNotFoundException {
ZipEntry zEntry = new ZipEntry(base + File.separator + file.getName());
zipOutput.putNextEntry(zEntry);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[1024];
int read = 0;
while((read =bis.read(buffer)) != -1){
zipOutput.write(buffer, 0, read);
}
bis.close();
}
重点:
①ZipEntry
其实就是即将要压缩文件的文件信息。
假设我们即将要压缩的是ggindex.jar
文件,路径是根路径。
那么我们就要在ZipEntry
对象中设置好。
ZipEntry zEntry = new ZipEntry(base + File.separator + file.getName());
zipOutput.putNextEntry(zEntry);
//根据上述的假设,我们就要这样写
ZipEntry zEntry = new ZipEntry("ggindex.jar");
zipOutput.putNextEntry(zEntry);//将其添加到压缩包中,准备进行压缩啦。
这里还要注意,ZipEntry
参数base + File.separator + file.getName()
是为了产生下面这样的效果。否则所有的文件都将会在根路径中。