2014-01-07 4 views
6

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.

+0

Sind Sie sicher, dass das Dekomprimieren-Tool, das Sie verwenden, um die Zeichen in Dateinamen verarbeiten kann? –

+0

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. –

+0

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? –

Antwort

2

[Update] Ich fand schließlich heraus, dass das Problem nicht im Code ist, sondern in der Tat mit dem Standard-ArchiveManager von Ubuntu ist. Der Inhalt wird nicht richtig erkannt/extrahiert. Wenn dieselbe Datei vom Windows-Zip-Handler geöffnet/extrahiert wird, funktioniert sie einwandfrei.

Darüber hinaus unterstützt Commons-Compresse neben der Zip-Datei eine Reihe anderer Formate, die von Java unterstützt werden.

http://commons.apache.org/proper/commons-compress/index.html

Verwandte Themen