2009-07-03 123 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);