Распаковка zip-файлов с акцентами - PullRequest
1 голос
/ 01 марта 2012

Я использую механизм 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-файла, не распаковывая его?

Ответы [ 2 ]

3 голосов
/ 14 июня 2013

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

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

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

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

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

0 голосов
/ 01 марта 2012

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

...