我正试图使用 java.util.zip
压缩归档文件,遇到了很多问题,其中大部分都已得到解决。现在我终于得到了一些输出结果,但我仍然无法获得“正确”的输出。我有一个已提取的 ODT 文件(更适合称为目录),我对其进行了一些修改。现在我想将该目录压缩以重新创建 ODT 文件结构。将该目录压缩并将其重命名为以 .odt 结尾的文件名可以正常工作,因此不应该有问题。
主要问题是我丢失了目录的内部结构。一切变得“扁平化”,我似乎找不到保留原始多层结构的方法。如果能得到一些帮助,我会非常感激,因为我似乎找不到问题所在。
以下是相关的代码片段:
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
FILEPATH.substring(0, FILEPATH.lastIndexOf(SEPARATOR) + 1).concat("test.zip")));
compressDirectory(TEMPARCH, out);
SEPARATOR
是系统文件分隔符,而FILEPATH
是原始ODT文件的文件路径。为了测试目的,我只是将内容写入同一目录下名为test.zip的文件中,但没有覆盖原来的文件。
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();
}
}
}
包含要压缩的文件的目录位于用户空间中,而不是与结果文件相同的目录中。我认为这可能会有问题,但我真的看不出来在哪里。此外,我想问题可能在于使用相同的流进行输出,但我也看不出来在哪里。我在一些示例和教程中看到他们使用了getPath()
而不是getName()
,但更改后给我一个空的zip文件。