英語以外の文字(Umlaut、アラビア語など)でファイルを圧縮できるコードを開発しようとしていますが、私はjavaバージョン1.7.0_45を使用しています。したがって、というバグが原因ではありません。ZipOutputStream
コンストラクタの場合、charsetをUTF-8に設定しています。Java 7でも英語以外の文字が含まれているファイルを書き込んだときのジップ入力が間違っています
ファイルからのエントリを読み取ろうとすると、(期待通りに)適切なファイル名が与えられるため、zipファイルが正しく書き込まれていることが保証されます。
しかし、UbuntuのデフォルトのArchiveManager/Unzipツールを使用して開く/解凍しようとすると、ファイル名が壊れてしまいます。ここで
が私のコードです:次のように
private void convertFilesToZip(List<File> files) {
FileInputStream inputStream = null;
try {
byte[] buffer = new byte[1024];
FileOutputStream fileOutputStream = new FileOutputStream("zipFile.zip");
ZipOutputStream outputStream = new ZipOutputStream(fileOutputStream, Charset.forName("UTF-8"));
for (File file : files) {
inputStream = new FileInputStream(file);
String filename = file.getName();
System.out.println("Adding file : " + filename);
outputStream.putNextEntry(new ZipEntry(filename));
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
outputStream.closeEntry();
}
if(inputStream != null) inputStream.close();
outputStream.close();
System.out.println("Zip created successfully");
System.out.println("=======================================================");
System.out.println("Reading zip Entries");
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(new File("zipFile.zip")), Charset.forName("UTF-8"));
ZipEntry zipEntry;
while((zipEntry=zipInputStream.getNextEntry())!=null){
System.out.println(zipEntry.getName());
zipInputStream.closeEntry();
}
zipInputStream.close();
} catch (IOException exception) {
exception.printStackTrace();
}
}
ファイルの出力は次のようになります。
Adding file : umlaut_ḧ.txt
Adding file : ذ ر ز س ش ص ض.txt
Adding file : äǟc̈ḧös̈ ẗǚẍŸ_uploadFile4.txt
Adding file : pingüino.txt
Adding file : ÄÖÜäöüß- Español deEspaña.ppt
Zip created successfully
=======================================================
Reading zip Entries
umlaut_ḧ.txt
ذ ر ز س ش ص ض.txt
äǟc̈ḧös̈ ẗǚẍŸ_uploadFile4.txt
pingüino.txt
ÄÖÜäöüß- Español deEspaña.ppt
は、誰もが成功し、私がここに実現したいものを実装しました。 誰かが私が逃したかもしれない、または間違っていたかもしれないことを私に指摘することはできますか?私はできるだけ多くのgoogleをしたし、Apache Commons Compress
でも試しました。
Java 7でバグが解決されたというバグレポートに記載されていますが、なぜコードが機能しないのですか?
ご協力いただきまして誠にありがとうございます。前もって感謝します。
あなたが使用している解凍ツールは、あなたのファイル名の文字を扱うことができることを確認していますか? –
はいそうです。前述のように、デフォルトのubuntuアーカイブマネージャとunzipツールは、ファイルを個別にzip/unzipすることができます。しかし、私のコードで作成されたファイルには名前がつぶれています。 –
私は 'ProcessBuilder'を使ってzipを作成する回避策を見つけました。しかし、それは非常に効率的な方法ではありません。誰もがJavaでそれを解決することができましたか? –