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);
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();
}
}
}
圧縮するファイルを含むディレクトリが作成されたファイルと同じディレクトリにどこかにユーザ空間ではないです。私はこれが問題になるかもしれないと仮定しますが、私は実際にどのように見ることができません。また、同じストリームを出力する際に問題が発生する可能性があると考えましたが、やり直しができません。いくつかの例とチュートリアルでは、getName()
の代わりにgetPath()
を使用していましたが、それを変更すると空のzipファイルが作成されます。
ありがとうございました!ああ元のディレクトリ形式が圧縮コードでどのように保持されているかわかりません。 ODTには空のディレクトリがあります。あなたのコードを理解する限り、それらのディレクトリは決して作成されません。多分私は何かを逃していますか – Eric
ディレクトリは '/'で終わる名前の空のエントリです。私はコードを変更しました。 – McDowell
私はあなたのコードの構造に適応し、再帰呼び出しを中止しました。私はこれを見て間違った方法だと思う。 1つの例外を除いて、コードは円滑に実行されます。空でない場合でもほとんどの子ディレクトリに空のフォルダが追加されます。私は、次の行を削除すると問題が解決することがわかりました:name = name.endsWith( "/")?名前:名前+ "/";私は、 "\"を追加してディレクトリを追加すると、内部に空のフォルダも作成されると思う。単にZipEntriesに構造体の世話をさせるだけで、すべてがうまくいくように見えます。あなたの助けをありがとう! – Eric