我正在尝试在我的机器上压缩以下文件结构,
parent/
parent/test1
parent/test1/image1.jpeg
parent/test2
这里的问题是我无法使用java压缩上述文件结构。我有谷歌,发现以下代码示例,但它只在给定文件夹中压缩文件。
File inFolder=new File("out");
File outFolder=new File("Out.zip");
ZipOutputStream out = new ZipOutputStream(new
BufferedOutputStream(new FileOutputStream(outFolder)));
BufferedInputStream in = null;
byte[] data = new byte[1000];
String files[] = inFolder.list();
for (int i=0; i<files.length; i++)
{
in = new BufferedInputStream(new FileInputStream
(inFolder.getPath() + "/" + files[i]), 1000);
out.putNextEntry(new ZipEntry(files[i]));
int count;
while((count = in.read(data,0,1000)) != -1)
{
out.write(data, 0, count);
}
out.closeEntry();
}
out.flush();
out.close();
在上面的代码中,out是一个文件夹,我们需要有一些文件。如果是这样,文件夹也不能为空它抛出异常java.util.zip.ZipException或者不能包含任何子文件夹甚至文件里面的文件(例如:out \ newfolder \ image.jpeg)如果是这样,它会抛出一个java.io.FileNotFoundException:out \ newfolder(访问被拒绝)。
在我的情况下,通过查询数据库,有时可以使用文件夹结构中的空文件夹来构建上述文件结构。
有人可以告诉我一个解决方案吗?
谢谢。
答案 0 :(得分:3)
您可能正在尝试将每个条目视为FileInputStream
。但是,对于目录,这不是真的。由于路径不是文件,因此当您尝试读取它时,会抛出FileNotFoundException
。对于目录,您仍然希望创建ZipEntry
,但不要尝试读取任何数据,只需跳过它并继续前进到下一个路径。
答案 1 :(得分:2)
写两种方法。第一个采用dirpath,创建一个zip流并调用另一个方法将文件复制到zip流,并递归调用自己的目录,如下所示:
第一种方法关闭了zip流。