首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逐行读取GZIPInputStream

逐行读取GZIPInputStream
EN

Stack Overflow用户
提问于 2009-07-03 18:19:17
回答 5查看 107.3K关注 0票数 87

我有一个.gz格式的文件。用于读取该文件的java类是GZIPInputStream。但是,这个类并没有扩展java的BufferedReader类。因此,我无法逐行读取文件。我需要这样的东西

代码语言:javascript
复制
reader  = new MyGZInputStream( some constructor of GZInputStream) 
reader.readLine()...

我想创建我的类,它扩展了java的Reader或BufferedReader类,并使用GZIPInputStream作为它的一个变量。

代码语言:javascript
复制
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);
    }

}

但是,当我使用

代码语言:javascript
复制
BufferedReader in = new BufferedReader(
    new MyGZFilReader("F:/gawiki-20090614-stub-meta-history.xml.gz"));
System.out.println(in.readLine());

有没有人能给我一些建议..

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-07-03 18:24:21

装饰器的基本设置如下:

代码语言:javascript
复制
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似乎是一种脆弱的特殊情况。

未能显式指定编码是against the second commandment.使用默认编码,后果自负!

票数 147
EN

Stack Overflow用户

发布于 2009-07-03 18:23:46

代码语言:javascript
复制
GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz"));
BufferedReader br = new BufferedReader(new InputStreamReader(gzip));
br.readLine();

票数 44
EN

Stack Overflow用户

发布于 2012-08-22 21:06:16

代码语言:javascript
复制
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);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1080381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档