3

Java 圧縮 API (java.util.ZIP パッケージ) を使用してファイルを圧縮しています。それはうまくいきます。ただし、以下の小さな問題があります。

入力ファイルがC:\temp\text.txtで、出力 (圧縮) ファイルがC:\temp\text.zip

WinZip を使用して圧縮ファイル (text.zip) を表示すると、内部フォルダー構造が正しく表示されます。と表示されtemp\text.txtます。ただし、同じファイルを 7Zip で開くと (右クリック -> 7Zip -> [アーカイブを開く] オプションを使用)、 の後に空のフォルダーが表示されC:\temp\text.zip\ます。を表示するには、7Zip アドレス バーtext.txtに入力する必要があります。C:\temp\text.zip\\\temp\ここで二重のバックスラッシュに注意して\\\ください。

以下は私のコードです:

String input="C:\temp\text.txt";
String output="C:\temp\text.zip";
FileOutputStream dest = new FileOutputStream(output);
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
out.setMethod(ZipOutputStream.DEFLATED); //Entries can be added to a ZIP file in a compressed (DEFLATED) form 
out.setLevel(this.getZIPLevel(Deflater.DEFAULT_COMPRESSION));

File file = new File(input);
final int BUFFER = 2048;
byte data[] = new byte[BUFFER];
BufferedInputStream origin = null;
FileInputStream fi;

fi = new FileInputStream(file);
origin = new BufferedInputStream(fi, BUFFER);

int index = file.getAbsolutePath().indexOf(":") + 1;
String relativePath = file.getPath().substring(index);

ZipEntry entry = new ZipEntry(relativePath);
out.putNextEntry(entry);
int count;
while((count = origin.read(data, 0, BUFFER)) != -1) {
      out.write(data, 0, count);
}
origin.close();
out.close();

7Zip を使用して追加の空のフォルダーが表示される理由を誰か教えてもらえますか? 私はJDK7を使用しています。

4

1 に答える 1

1

まず、これを修正してみてください。

String input = "C:\\temp\\text.txt";
String output = "C:\\temp\\text.zip";

\String 内の charをエスケープする必要があることに注意してください。これが有効なエスケープ シーケンスであることを考えると"\t"、以前は機能していた可能性がありますが、名前の途中でいくつかのタブ文字がスローされていました。パスセパレーターをエスケープする必要を避けるために、次のように書くことができます:

String input = "C:/temp/text.txt";
String output = "C:/temp/text.zip";

そして、もう少し移植性を高めるために、 と の両方を、環境に適したシステム依存の名前区切り記号を保持する定数に置き換えることができます"\\"(ただし、この部分は移植性がありません)。"/"File.separator"C:"

于 2012-05-29T10:25:34.037 に答える