Я пытаюсь разработать код, который может обрабатывать 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, то почему код не работает.
Любая помощь очень ценится. Заранее спасибо.
Вы уверены, что инструмент Распакуйте, что вы используете может обрабатывать символы в ваших именах файлов? –
да это. Как уже упоминалось, и менеджер архивов uubuntu по умолчанию, и unzip-инструмент могут отдельно распаковывать/распаковывать файлы. Но файл, созданный моим кодом, имеет имена, испорченные. –
Я столкнулся с обходным решением, где я использую 'ProcessBuilder' для создания zip. Но это не очень эффективный способ. Кто-нибудь смог разрешить это с помощью java? –