を使用してアーカイブを圧縮しようとした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();
}
}
}
zip するファイルを含むディレクトリは、結果のファイルと同じディレクトリではなく、ユーザー空間のどこかにあります。これは問題になる可能性があると思いますが、どうすればよいかわかりません。また、出力に同じストリームを使用することに問題がある可能性があると考えましたが、やはり方法がわかりません。いくつかの例とチュートリアルで、代わりに使用するのを見ましたgetPath()
が、getName()
それを変更すると、空の zip ファイルが得られます。