Чтение файла GZIP, вызывающее неожиданный конец потока ввода ZLIB в Java - PullRequest
1 голос
/ 10 апреля 2019

Я конвертирую байтовый массив GZIP в строковую форму в Java. Это довольно большой файл, и идея состоит в том, чтобы преобразовать его в JSON.

Но Исключение, которое я получаю, довольно странно и не имеет особого смысла.

Фрагмент кода:

public static String convert(byte[] bytes) throws IOException {
        final byte[] BUFFER = new byte[16234];

        GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(bytes));

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        int len;
        while ((len = gzipInputStream.read(BUFFER)) >= 0) {
            byteArrayOutputStream.write(BUFFER, 0, len);
          if(byteArrayOutputStream.size ()>60812918){
                System.out.println ( "stopping here" );
            }
        }

        byteArrayOutputStream.flush();
        byteArrayOutputStream.close();

        gzipInputStream.close();

        final byte[] dataPart = byteArrayOutputStream.toByteArray();

        String data = new String(dataPart, StandardCharsets.UTF_8);

        return data;
    }

Трассировка исключений:

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:117)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)
    at com.here.rcs.discoverkernels.testS3FileReader.convert(testS3FileReader.java:84)
    at com.here.rcs.discoverkernels.testS3FileReader.viewJson(testS3FileReader.java:45)
    at com.here.rcs.discoverkernels.testS3FileReader.main(testS3FileReader.java:21)

С точки зрения кодирования, я не думаю, что с этим фрагментом кода что-то не так.

Любые предложения о том, как двигаться вперед с этим.

Добавление в преобразование байтов;

public static byte[] compress(final String data) throws IOException {

    final byte[] dataPart = data.getBytes( StandardCharsets.UTF_8 );

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

    GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
    gzipOutputStream.write(dataPart);

    gzipOutputStream.flush();
    gzipOutputStream.close();

    byte[] bytes = byteArrayOutputStream.toByteArray();

    return bytes;
}

1 Ответ

0 голосов
/ 10 апреля 2019

Я попробовал вашу программу с небольшим файлом .gz, и он работает как положено. Я думаю, что

  1. есть проблемы с обработкой больших файлов, или, более вероятно,
  2. Вы неправильно загрузили данные из файла в массив bytes. Как ты? Я следил за этой статьей: https://netjs.blogspot.com/2015/11/how-to-convert-file-to-byte-array-java.html
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...