通过线GZIPInputStream读线通过线GZIPInputStream读线(GZIPInput

2019-05-16 16:13发布

我有。广州格式的文件。 阅读此文件中的Java类是GZIPInputStream。 但是,此类不扩展BufferedReader类的Java。 其结果是,我不能够按行读取文件中的行。 我需要的是这样的

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

不过,我觉得我的创建类扩展了Reader或BufferedReader类,爪哇和使用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());

可有人建议如何进行..

Answer 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”,...? 有数以百计的可能性,正确的选择通常无法从文件本身来决定。 它必须通过了带外信道的一些被指定。

比如,也许它的平台默认。 在网络环境中,然而,这是极其脆弱的。 与写入文件中的机器可能会坐在临桌,但有一个不同的默认文件编码。

大多数网络协议使用的标题或其他元数据明确地指出的字符编码。

在这种情况下,它似乎从文件扩展名的内容为XML。 XML包括用于此目的的XML声明中的“编码”属性。 此外,XML确实应该有一个XML解析器处理,而不是文字。 读取XML行由行似乎是一个脆弱的,特殊的情况。

如果不明确指定编码是针对第二诫。 使用默认的编码后果自负!



Answer 2:

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



Answer 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);


Answer 4:

您可以在一个实用程序类使用下面的方法,并用它在必要时...

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;
}


Answer 5:

这里是一个线

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


文章来源: GZIPInputStream reading line by line