Как исправить ошибку чтения EOF с помощью GZIPInputStream

Я пытаюсь прочитать содержимое файла gzip и создать из него файл. Я столкнулся с проблемой, которую не могу понять. Любые идеи предложения приветствуются. Спасибо.

private static String unzip(String gzipFile, String location){

        try {
            FileInputStream in = new FileInputStream(gzipFile);
            FileOutputStream out = new FileOutputStream(location);
            GZIPInputStream gzip = new GZIPInputStream(in);

            byte[] b = new byte[1024];
            int len;
            while((len = gzip.read(b)) != -1){
                out.write(buffer, 0, len);
            }

            out.close();
            in.close();
            gzip.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:240)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:116)
at java.io.FilterInputStream.read(FilterInputStream.java:107)

person Kaleb Blue    schedule 29.05.2020    source источник
comment
Вы уверены, что входной файл действителен? Обратите внимание, что переменной buffer внутри цикла while не существует (вы, вероятно, имели в виду b)   -  person GPI    schedule 29.05.2020


Ответы (1)


Вы значительно облегчите себе жизнь, используя блоки ресурсов, чтобы обеспечить файлы закрываются корректно. Например:

private static String unzip(String gzipFile, String location){

        try (
            FileInputStream in = new FileInputStream(gzipFile);
            GZIPInputStream gzip = new GZIPInputStream(in);
            FileOutputStream out = new FileOutputStream(location))
        {

            byte[] b = new byte[4096];
            int len;
            while((len = gzip.read(b)) >= 0){
                out.write(b, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Вы также должны убедиться, что у вас есть действительный файл .zip (конечно!) и что ваши входные и выходные имена файлов различны.

А что происходит с "буфером"? Я предполагаю (как и GPI), вы, вероятно, имели в виду «b»?

person FoggyDay    schedule 29.05.2020