java.util.zip - 重新创建目录结构
在尝试使用压缩存档时,我遇到了很多问题,其中大部分我都解决了。现在我终于得到了一些输出,我很难得到“正确”的输出。我有一个提取的ODT文件(目录更适合描述),我对它做了一些修改。现在我想压缩该目录以重新创建ODT文件结构。压缩目录并将其重命名为以.odt结尾工作正常,因此应该没有问题。java.util.zip
主要问题是我失去了目录的内部结构。一切都变得“扁平”,我似乎没有找到一种方法来保留原始的多层结构。我将不胜感激,因为我似乎找不到问题。
以下是相关的代码片段:
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
FILEPATH.substring(0, FILEPATH.lastIndexOf(SEPARATOR) + 1).concat("test.zip")));
compressDirectory(TEMPARCH, out);
是系统文件分隔符,是原始ODT的文件路径,我将覆盖它,但出于测试目的,这里没有这样做。我只是在同一目录中写入一个测试.zip文件。SEPARATOR
FILEPATH
private void compressDirectory(String directory, ZipOutputStream out) throws IOException
{
File fileToCompress = new File(directory);
// list contents.
String[] contents = fileToCompress.list();
// iterate through directory and compress files.
for(int i = 0; i < contents.length; i++)
{
File f = new File(directory, contents[i]);
// testing type. directories and files have to be treated separately.
if(f.isDirectory())
{
// add empty directory
out.putNextEntry(new ZipEntry(f.getName() + SEPARATOR));
// initiate recursive call
compressDirectory(f.getPath(), out);
// continue the iteration
continue;
}else{
// prepare stream to read file.
FileInputStream in = new FileInputStream(f);
// create ZipEntry and add to outputting stream.
out.putNextEntry(new ZipEntry(f.getName()));
// write the data.
int len;
while((len = in.read(data)) > 0)
{
out.write(data, 0, len);
}
out.flush();
out.closeEntry();
in.close();
}
}
}
包含要 zip 的文件的目录位于用户空间中的某个位置,而不是与生成的文件位于同一目录中。我想这可能是麻烦,但我真的看不出如何。另外,我认为问题可能在于使用相同的流进行输出,但我再次看不到如何。我在一些示例和教程中看到他们使用而不是更改,这给了我一个空的zip文件。getPath()
getName()