2009-07-03 119 views
61

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

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

可有人建议如何进行工作..

+0

看看这个链接http://stackoverflow.com/q/6717165/779408。在那里表示压缩和解压缩方法。 – breceivemail 2013-01-15 10:41:39

+0

为了爱这个世界上所有的善良和正确的事物,以及任何开发者的理智,即使是远程编码也是如此......请注意编码@erickson要点!他是唯一指出这一点的答案,这让我想哭。 – James 2013-02-07 20:59:17

回答

114

装饰的基本设置是这样的:

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声明中包含“encoding”属性。此外,XML应该真正用XML解析器处理,而不是文本。逐行读取XML似乎是一个脆弱的特例。

未明确指定编码against the second commandment.在您的危险中使用默认编码!

0

什么:

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

+0

你的回答很好。简洁明了..但是,埃里克森的答案更为详细。 – 2009-07-04 15:54:50

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