GZIPInputStream逐行读取

Kap*_*l D 77 java file-io filereader gzipinputstream

我有一个.gz格式的文件.用于读取此文件的java类是GZIPInputStream.但是,此类不会扩展Java的BufferedReader类.结果,我无法逐行读取文件.我需要这样的东西

reader  = new MyGZInputStream( some constructor of GZInputStream) 
reader.readLine()...
Run Code Online (Sandbox Code Playgroud)

我创建了我的类,它扩展了Java的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);
    }

}
Run Code Online (Sandbox Code Playgroud)

但是,当我使用时,这不起作用

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

有人可以建议如何继续..

eri*_*son 136

装饰器的基本设置如下:

InputStream fileStream = new FileInputStream(filename);
InputStream gzipStream = new GZIPInputStream(fileStream);
Reader decoder = new InputStreamReader(gzipStream, encoding);
BufferedReader buffered = new BufferedReader(decoder);
Run Code Online (Sandbox Code Playgroud)

这个片段中的关键问题是.的价值encoding.这是文件中文本的字符编码.是"US-ASCII","UTF-8","SHIFT-JIS","ISO-8859-9",......?有数百种可能性,通常无法从文件本身确定正确的选择.必须通过一些带外信道指定.

例如,也许它是平台的默认值.然而,在网络环境中,这非常脆弱.写入文件的机器可能位于相邻的隔间中,但具有不同的默认文件编码.

大多数网络协议使用标头或其他元数据来明确记录字符编码.

在这种情况下,从文件扩展名看来内容是XML.为此,XML在XML声明中包含"encoding"属性.此外,XML应该真正使用XML解析器处理,而不是作为文本处理.逐行阅读XML似乎是一个脆弱的特殊情况.

未能明确指定编码是违反第二条诫命的. 使用默认编码会带来危险!

  • @KapilD让我感到遗憾的是你完全错过了关于编码的观点...正如你的评论和评论中的例子所示.重读埃里克森的答案......也许是30次. (12认同)

Chs*_*y76 41

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