Распаковка zip файлов с диакритическими знаками

Я использую механизм Java для извлечения zip-файлов. Механизм работает нормально, если в нем нет файлов с акцентами на заголовке. Поскольку я из Португалии, в моем языке обычно используются такие символы, как ã, ç, õ, é и т. д. Если какой-либо из этих символов присутствует в имени файла, возникает исключение ввода-вывода.

while (zipFileEntries.hasMoreElements()) {
    ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();    
    File destFile = new File(unzipDestinationDirectory, currentEntry);
    File destinationParent = destFile.getParentFile();

    // create the parent directory structure if needed
    destinationParent.mkdirs();

    // extract file if not a directory
    if (!entry.isDirectory()) {                 
        BufferedInputStream is =
            new BufferedInputStream(zip_file.getInputStream(entry));
        int currentByte;                
        byte data[] = new byte[BUFFER];

        // write the current file to disk
        FileOutputStream fos = new FileOutputStream(destFile);                  
        BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER);

        // read and write until last byte is encountered
        while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
            dest.write(data, 0, currentByte);
        }

        dest.flush();
        dest.close();
        is.close();
    }

Вылетает на while((currentByte = is.read(data, 0, BUFFER)) != -1)

java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:134)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
    at parsers.ZipParser.decompressZipFile(ZipParser.java:83)
    at poc.MainPOC.main(MainPOC.java:61)

Известны ли вам какие-либо обходные пути для решения этой проблемы? Могу ли я изменить имя файла внутри zip, не распаковывая его?


person nunoaac    schedule 01.03.2012    source источник


Ответы (2)


Начиная с Java 7, новый конструктор позволяет ZipInputStream указать кодировку для использования в имени файла. См. документацию здесь.

Таким образом, вы должны создать свой ZipInputStream с чем-то вроде:

ZipInputStream zis = new ZipInputStream(new FileInputStream("your zip file"), Charset.forName("Encoding here"));

См. Charset, чтобы иметь немного больше информации о том, как его использовать.

Это не изменит способ чтения файла, поэтому вам понадобится другой обходной путь для чтения содержимого. Но для получения дополнительной информации см. этот ответ кодировка символов Java zip, возможно, вы можете повторно использовать часть кода.

person Marc-Andre    schedule 14.06.2013
comment
Я проверил предоставленный вами ответ и поставил Charset.forName("ISO-8859-1") для французского акцента. ТЮ - person WannaGetHigh; 24.05.2016

Я думаю, что вы должны правильно установить кодировку при сжатии и распаковке. Вы сделали это UTF-8, когда создавали ZIP-файл? Если нет, то рекомендую попробовать.

person duffymo    schedule 01.03.2012
comment
Я не несу ответственности за создание входного zip-файла. Я не имею никакого влияния на то, как создаются zip-файлы... - person nunoaac; 01.03.2012
comment
Вам придется найти это влияние, иначе оно не сработает. Возможно, вам нужно поговорить с партнером, который их создает. - person duffymo; 01.03.2012
comment
На самом деле это не вариант: / Я заменю java.util.zip на библиотеку Apache Commons IO. - person nunoaac; 01.03.2012
comment
Который использует - подождите - классы java.util.zip для выполнения своей работы. - person duffymo; 01.03.2012