2014-01-07 2 views
6

Я пытаюсь разработать код, который может обрабатывать ZIP-файлы с неанглийскими символами (Umlaut, Arabic и т. Д.), Но zipped-файл содержит неправильные имена. Я использую java version 1.7.0_45, поэтому это не должно быть связано с ошибкой, упомянутой here. Я устанавливаю кодировку для UTF-8 для конструктора ZipOutputStream, и, согласно Javadocs, он должен работать в соответствии с моими требованиями.Неправильные записи в почтовом индексе при написании имени файла, содержащего неанглийские символы, даже с Java 7

Я уверен, что zip-файл записывается правильно, так как попытка чтения записей из файла дает правильные имена файлов (как и ожидалось).

Однако, когда я пытаюсь открыть/извлечь с помощью утилиты ArchiveManager/Unzip по умолчанию Ubuntu, имена файлов перепутаны.

Вот мой код:

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 

Кто-нибудь успешно реализовать то, что я хочу достичь здесь. Может кто-то указать мне на то, что я, возможно, пропустил или делал неправильно. Я сделал все, что мог, и даже попробовал Apache Commons Compress, но все равно не повезло.

Как указано в сообщении об ошибке, ошибка в Java 7, то почему код не работает.

Любая помощь очень ценится. Заранее спасибо.

+0

Вы уверены, что инструмент Распакуйте, что вы используете может обрабатывать символы в ваших именах файлов? –

+0

да это. Как уже упоминалось, и менеджер архивов uubuntu по умолчанию, и unzip-инструмент могут отдельно распаковывать/распаковывать файлы. Но файл, созданный моим кодом, имеет имена, испорченные. –

+0

Я столкнулся с обходным решением, где я использую 'ProcessBuilder' для создания zip. Но это не очень эффективный способ. Кто-нибудь смог разрешить это с помощью java? –

ответ

2

[Обновить] Наконец-то выяснилось, что проблема не в коде, а на самом деле с архиватором UBuntu по умолчанию. Он не распознает/не извлекает содержимое должным образом. Когда тот же файл открывается/извлекается обработчиком zip windows, он работает безупречно.

Кроме того, commons-compress поддерживает множество других форматов, кроме ZIP, gzip, поддерживаемых Java.

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

Смежные вопросы