java распаковать zip-файл с именами файлов в юникоде

Как распаковать zip-файл с именем файла unicode? Это мой код:

try {
    ZipInputStream zis = new ZipInputStream(
            new FileInputStream(zipFile));
    ZipEntry ze = zis.getNextEntry();

    System.setProperty("file.encoding", "UTF-8");
    while (ze != null) {
        String fileName = new String(ze.getName().getBytes("UTF-8"));
        System.out.println(fileName);
        File newFile = new File(outputFolder + File.separator + fileName );

        BufferedOutputStream outStream = new BufferedOutputStream(new FileOutputStream(newFile));
        OutputStreamWriter osw = new OutputStreamWriter(outStream, Charset.forName("UTF-8"));
        int ch;
        StringBuffer buffer1 = new StringBuffer();
        while ((ch = zis.read()) > -1) {
            buffer1.append((char) ch);
        }
        osw.write(buffer1.toString());
        osw.close();
        outStream.close();

        ze = zis.getNextEntry();
    }

    zis.closeEntry();
    zis.close();
} catch (IOException ex) {
    ex.printStackTrace();
}

но получаю ошибку: UTFDataFormatException:

06-05 08:46:33.394: W/System.err(777): java.io.UTFDataFormatException: bad second or third byte at 6 
06-05 08:46:33.394: W/System.err(777): at java.nio.charset.ModifiedUtf8.decode(ModifiedUtf8.java:56) 
06-05 08:46:33.426: W/System.err(777): at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:270) 
06-05 08:46:33.426: W/System.err(777): at com.learnlang.utility.ZipManager.unZipIt(ZipManager.java:62) 
06-05 08:46:33.434: W/System.err(777): at com.learnlang.HomeActivity$progressThread.run(HomeActivity.java:317) 

Мой класс ZipManager.

Как решить эту проблему?


person shuttle1978    schedule 05.06.2013    source источник
comment
Предоставьте, пожалуйста, полную трассировку стека исключения   -  person Andremoniy    schedule 05.06.2013
comment
06-05 08:46:33.394: W/System.err(777): java.io.UTFDataFormatException: неправильный второй или третий байт в 6 06-05 08:46:33.394: W/System.err(777): в java.nio.charset.ModifiedUtf8.decode(ModifiedUtf8.java:56) 06-05 08:46:33.426: W/System.err(777): в java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:270 ) 06-05 08:46:33.426: W/System.err(777): в com.learnlang.utility.ZipManager.unZipIt(ZipManager.java:62) 06-05 08:46:33.434: W/System.err (777): в com.learnlang.HomeActivity$progressThread.run(HomeActivity.java:317) Мой класс ZipManager   -  person shuttle1978    schedule 05.06.2013
comment
Вы уверены, что имена файлов имеют кодировку UTF-8? Похоже, что расшифровка имени файла UTF-8 не удалась.   -  person Uwe Plonus    schedule 05.06.2013
comment
Способ кодирования имен файлов зависит от операционной системы. Вы используете Windows, OS X, Linux или что-то еще?   -  person Joni    schedule 05.06.2013
comment
Привет Shuttle1978, я только что столкнулся с той же проблемой здесь. Вы решили это наконец?   -  person Bowie    schedule 05.01.2015
comment
У меня точно такая же проблема! пожалуйста, предоставьте свое решение.   -  person Behrouz.M    schedule 05.01.2015


Ответы (1)


Согласно исключению, кажется, что ваш файл на самом деле не в кодировке UTF-8.

Кроме того, проблема не в имени файла. Эта строка:

 String fileName = new String(ze.getName().getBytes("UTF-8"));

бессмысленно, потому что ze.getName() уже является правильной строкой Java.

person Andremoniy    schedule 05.06.2013
comment
имя файла, которое я пытаюсь разархивировать, - de_Maße-und-Gewichte_de, я пробовал только с ze.getName(), но это не работает - person shuttle1978; 05.06.2013
comment
@ Shuttle1978 Что вы подразумеваете под «это не работает»? Какое исключение вы получаете в этом случае? - person Andremoniy; 05.06.2013
comment
то же исключение UTFDataFormatException - person shuttle1978; 05.06.2013
comment
использование файла newFile = новый файл (outputFolder + File.separator + e.getName()); исключение такое же - person shuttle1978; 05.06.2013
comment
@ shuttle1978 вы получаете такое же исключение только потому, что проблема не в имени файла, а в кодировке всего файла. - person Andremoniy; 05.06.2013
comment
хорошо, но если я распаковываю файл вручную, он работает нормально, и вместо этого я вижу файл de_Maße-und-Gewichte_de с java-кодом. У меня проблема - person shuttle1978; 05.06.2013