Ich versuche Code zu entwickeln, der Dateien mit nicht-englischen Zeichen (Umlaut, Arabisch usw.) zippen kann, aber die gezippte Datei enthält falsche Namen. Ich benutze Java-Version 1.7.0_45 daher sollte es nicht wegen der Fehler erwähnt here sein. Ich setze den Zeichensatz auf UTF-8 für den ZipOutputStream
Konstruktor und nach Javadocs sollte es nach meinen Anforderungen funktionieren.Falsche Zip-Einträge beim Schreiben von Dateinamen mit nicht-englischen Zeichen auch mit Java 7
Ich bin sicher, dass die ZIP-Datei korrekt geschrieben wird, als ein Versuch, Einträge aus der Datei zu lesen, gibt die richtigen Dateinamen (wie erwartet).
Wenn ich jedoch versuche, mit Ubuntu Standard ArchiveManager/Unzip-Tool zu öffnen/zu extrahieren, sind die Dateinamen durcheinander.
Hier ist mein Code:
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();
}
}
die Ausgabe für die Dateien ist wie folgt:
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
Hat jemand erfolgreich umgesetzt, was ich hier erreichen wollen. Kann mir jemand zeigen, was ich verpasst habe oder falsch gemacht habe.Ich habe das ganze google gemacht und habe sogar versucht Apache Commons Compress
aber immer noch kein Glück.
Es ist in dem Fehlerbericht erwähnt, dass der Fehler in Java 7 behoben wird, warum funktioniert der Code dann nicht.
Jede Hilfe wird sehr geschätzt. Danke im Voraus.
Sind Sie sicher, dass das Dekomprimieren-Tool, das Sie verwenden, um die Zeichen in Dateinamen verarbeiten kann? –
ja ist es. Wie bereits erwähnt, können sowohl der Standard-Ubuntu-Archiv-Manager als auch das Unzip-Tool die Dateien separat komprimieren/entpacken. Aber, die Datei, die von meinem Code erstellt wurde, hat Namen vermasselt. –
Ich bin auf einen Workaround gestoßen, wo ich 'ProcessBuilder' verwende, um die Zip zu erstellen. Aber es ist kein sehr effizienter Weg. Hat jemand es mit Java lösen können? –