Подтвердить что ты не робот

Чтение GZIPInputStream по строкам

У меня есть файл в формате .gz. Класс java для чтения этого файла - GZIPInputStream. Тем не менее, этот класс не расширяет класс BufferedReader java. В результате я не могу прочитать файл по строкам. Мне нужно что-то вроде этого

reader  = new MyGZInputStream( some constructor of GZInputStream) 
reader.readLine()...

Я, хотя и создаю свой класс, который расширяет класс чтения или BufferedReader java и использует GZIPInputStream как одну из его переменных.

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader;
import java.util.zip.GZIPInputStream;

public class MyGZFilReader extends Reader {

    private GZIPInputStream gzipInputStream = null;
    char[] buf = new char[1024];

    @Override
    public void close() throws IOException {
        gzipInputStream.close();
    }

    public MyGZFilReader(String filename)
               throws FileNotFoundException, IOException {
        gzipInputStream = new GZIPInputStream(new FileInputStream(filename));
    }

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        // TODO Auto-generated method stub
        return gzipInputStream.read((byte[])buf, off, len);
    }

}

Но это не работает, когда я использую

BufferedReader in = new BufferedReader(
    new MyGZFilReader("F:/gawiki-20090614-stub-meta-history.xml.gz"));
System.out.println(in.readLine());

Может кто-нибудь посоветует, как действовать дальше.

4b9b3361

Ответ 1

Основная настройка декораторов такова:

InputStream fileStream = new FileInputStream(filename);
InputStream gzipStream = new GZIPInputStream(fileStream);
Reader decoder = new InputStreamReader(gzipStream, encoding);
BufferedReader buffered = new BufferedReader(decoder);

Ключевой проблемой в этом фрагменте является значение encoding. Это символьная кодировка текста в файле. Это "US-ASCII", "UTF-8", "SHIFT-JIS", "ISO-8859-9", & hellip;? есть сотни возможностей, и правильный выбор обычно не может быть определен из самого файла. Он должен быть определен через некоторый внеполосный канал.

Например, возможно, это платформа по умолчанию. Однако в сетевой среде это очень хрупко. Машина, которая написала файл, может находиться в соседней ячейке, но имеет другую кодировку по умолчанию.

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

В этом случае из расширения файла видно, что содержимое является XML. Для этой цели XML содержит атрибут "encoding" в объявлении XML. Кроме того, XML должен действительно обрабатываться с помощью синтаксического анализатора XML, а не текста. Чтение XML по строкам похоже на хрупкий частный случай.

Невозможно явно указать кодировку для второй команды. Использовать кодировку по умолчанию по вашей опасности!

Ответ 2

GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz"));
BufferedReader br = new BufferedReader(new InputStreamReader(gzip));
br.readLine();

Ответ 3

BufferedReader in = new BufferedReader(new InputStreamReader(
        new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz"))));

String content;

while ((content = in.readLine()) != null)

   System.out.println(content);

Ответ 4

Как насчет:

GZIPInputStream zipReader = new GZIPInputStream();
InputStreamReader streamReader = new InputStreamReader(zipReader);
BufferedReader bufferedReader = new BufferedReader(streamReader);

Ответ 5

Вы можете использовать следующий метод в классе утилит и использовать его при необходимости...

public static List<String> readLinesFromGZ(String filePath) {
    List<String> lines = new ArrayList<>();
    File file = new File(filePath);

    try (GZIPInputStream gzip = new GZIPInputStream(new FileInputStream(file));
            BufferedReader br = new BufferedReader(new InputStreamReader(gzip));) {
        String line = null;
        while ((line = br.readLine()) != null) {
            lines.add(line);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace(System.err);
    } catch (IOException e) {
        e.printStackTrace(System.err);
    }
    return lines;
}

Ответ 6

вот с одной строчкой

try (BufferedReader br = new BufferedReader(
        new InputStreamReader(
           new GZIPInputStream(
              new FileInputStream(
                 "F:/gawiki-20090614-stub-meta-history.xml.gz"))))) 
     {br.readLine();}