GZIPInputStream последовательность конца файла в BufferedReader - PullRequest
1 голос
/ 28 июня 2011

Я использую объект Java BufferedReader для чтения построчно GZIPInputStream, который указывает на действительный архив GZIP, содержащий 1000 строк текста ASCII, в типичном формате CSV. Код выглядит так:

BufferedReader buffer = new BufferedReader(new InputStreamReader(
                        new GZIPInputStream(new FileInputStream(file))));

где файл - это фактический объект File, указывающий на архив.

Я прочитал весь файл, позвонив

int count = 0;
String line = null;

while ((line = reader.readLine()) != null)
{
    count++;
}

и считыватель просматривает файл, как и ожидалось, но в конце он обходит строку # 1000 и читает еще одну строку (т. Е. Count = 1001 после завершения цикла).

Вызов line.length () в последней строке сообщает о большом количестве (4000+) символов, которые невозможно распечатать ( Character.getNumericValue () возвращает -1).

На самом деле, если я сделаю line.getBytes () , результирующий массив byte [] будет иметь равное количество символов NULL ('\ 0').

Похоже ли это на ошибку в BufferedReader?

В любом случае, кто-нибудь может предложить обходной путь, чтобы обойти это поведение?

РЕДАКТИРОВАТЬ: Более странное поведение : Для чтения первой строки указывается имя файла, несколько символов NULL ('\ 0') и имя строки и имя группы, затем следует фактический текст!

РЕДАКТИРОВАТЬ: я создал очень простой тестовый класс, который воспроизводит эффект, который я описал выше, по крайней мере, на моей платформе.

РЕДАКТИРОВАТЬ: По-видимому, ложная тревога, файл, который я получал, был не простым GZIP, а tared GZIP, так что это объясняет это, нет необходимости в дальнейшем тестировании. Спасибо всем!

1 Ответ

3 голосов
/ 29 июня 2011

Я думаю, что нашел вашу проблему.

Я попытался воспроизвести ее с вашим источником в вопросе, и получил такой вывод:

-------------------------------------
        Reading PLAIN file
-------------------------------------

Printable part of line 1:       This, is, line, number, 1

Line start (<= 25 characters): This__is__line__number__1

No NULL characters in line 1

Other information on line 1:
        Length: 25
        Bytes: 25
        First byte: 84

Printable part of line 10:      This, is, line, number, 10

Line start (<= 26 characters): This__is__line__number__10

No NULL characters in line 10

Other information on line 10:
        Length: 26
        Bytes: 26
        First byte: 84

File lines read: 10

-------------------------------------
        Reading GZIP file
-------------------------------------

Printable part of line 1:       This, is, line, number, 1

Line start (<= 25 characters): This__is__line__number__1

No NULL characters in line 1

Other information on line 1:
        Length: 25
        Bytes: 25
        First byte: 84

Printable part of line 10:      This, is, line, number, 10

Line start (<= 26 characters): This__is__line__number__10

No NULL characters in line 10

Other information on line 10:
        Length: 26
        Bytes: 26
        First byte: 84

File lines read: 10

-------------------------------------
        TOTAL READ
-------------------------------------

Plain: 10, GZIP: 10

Я думаю, что это не то, что выиметь.Зачем?Вы используете файл tar.gz.Это tar формат архива и дополнительно сжатие gzip.GZipInputStream отменяет сжатие gzip, но ничего не знает о формате архива tar.

tar обычно используется для упаковки нескольких файлов вместе - в несжатом формате, но вместе с некоторыми метаданными, что и наблюдается:

РЕДАКТИРОВАТЬ: более странное поведение: чтение первой строки начинается с имени файла, нескольких символов NULL ('\ 0') и строки имени пользователя и имени группы, затем следует фактический текст!

Если у вас есть файл tar, вам нужно использовать tar-декодер. Как извлечь файл tar в Java? дает некоторые ссылки (например, с помощью задачи Tar из Ant), также есть JTar .

Если вы хотитеотправьте только один файл, лучше используйте формат gzip напрямую (именно это я и сделал в моем тесте).

Но нигде нет ошибок, кроме того, что вы ожидаете, что gzip-поток прочитаетформат tar.

...