2011-06-28 73 views
1

我使用Java BufferedReader對象逐行讀取GZIPInputStream,該GZIPInputStream指向包含1,000行ASCII文本的有效GZIP壓縮文件,採用典型的CSV格式。代碼如下所示:GZIPInputStream BufferedReader中的文件結束序列

BufferedReader buffer = new BufferedReader(new InputStreamReader(
         new GZIPInputStream(new FileInputStream(file)))); 

其中file是指向歸檔的實際文件對象。

我經歷了所有的文件,通過調用

int count = 0; 
String line = null; 

while ((line = reader.readLine()) != null) 
{ 
    count++; 
} 

讀取和讀卡器進入了預期的文件,但最終它繞過線#1000和讀取一個多行後(即數= 1001結束循環)。

調用line.length()在最後一行報告了大量的(4000 +)字符,所有這些都是不可打印的(Character.getNumericValue()返回-1)。

其實,如果我這樣做line.getBytes()生成的byte []數組有相同數量的NULL字符('\ 0')。

這看起來像是BufferedReader中的錯誤嗎?

在任何情況下,任何人都可以請建議一種解決方法來繞過此行爲?

編輯:更奇怪的行爲:第一行讀取的前綴是文件名,幾個NULL字符('\ 0')和東西線用戶名和組名,然後實際文本如下!

編輯:我創建了一個非常簡單的測試類,它重現了我上面描述的效果,至少在我的平臺上。

編輯:顯然是虛驚一場,我得到的文件不是普通的GZIP,但塗了焦油的GZIP,所以這解釋了它,不需要進一步測試。感謝大家!

+0

調試方式:使用外部'gzip'提取文件,並省略'GZIPInputStream' - 並查看提取的文件。這可能是你的gzip文件有問題,或者InputStreamReader或BufferedReader有錯誤。或者GzipInputStream。 –

+1

您正在談論一個簡單的gzip文件,但您的代碼引用了一個'tar.gz'文件。爲什麼?你知道tar + gz文件和gzip不一樣嗎? – leonbloy

+0

既然你有問題的答案,接受其中一個答案,投票答覆誰幫助你等是一個好主意。 – woliveirajr

回答

3

我想我找到了你的問題。

我試圖在這個問題源重現它,並得到這個輸出:

------------------------------------- 
     Reading PLAIN file 
------------------------------------- 

Printable part of line 1:  This, is, line, number, 1 

Line start (<= 25 characters): This__is__line__number__1 

No NULL characters in line 1 

Other information on line 1: 
     Length: 25 
     Bytes: 25 
     First byte: 84 

Printable part of line 10:  This, is, line, number, 10 

Line start (<= 26 characters): This__is__line__number__10 

No NULL characters in line 10 

Other information on line 10: 
     Length: 26 
     Bytes: 26 
     First byte: 84 

File lines read: 10 

------------------------------------- 
     Reading GZIP file 
------------------------------------- 

Printable part of line 1:  This, is, line, number, 1 

Line start (<= 25 characters): This__is__line__number__1 

No NULL characters in line 1 

Other information on line 1: 
     Length: 25 
     Bytes: 25 
     First byte: 84 

Printable part of line 10:  This, is, line, number, 10 

Line start (<= 26 characters): This__is__line__number__10 

No NULL characters in line 10 

Other information on line 10: 
     Length: 26 
     Bytes: 26 
     First byte: 84 

File lines read: 10 

------------------------------------- 
     TOTAL READ 
------------------------------------- 

Plain: 10, GZIP: 10 

我想這是不是你有什麼。爲什麼?您正在使用tar.gz文件。這是tar archive format,另外還有gzip壓縮。 GZipInputStream取消了gzip壓縮,但對tar歸檔格式一無所知。

焦油通常用於包裝多個文件一起 - 以未壓縮格式,但也有一些元數據,這是你看到什麼在一起:

編輯:更多怪異的行爲:第一行讀取由前綴文件名, 幾個NULL字符('\ 0')和東西線用戶名和組名,然後 的實際文字如下!

如果您有tar文件,則需要使用tar解碼器。How do I extract a tar file in Java?給出了一些鏈接(如使用Ant的Tar任務),也有JTar

如果您只想發送一個文件,最好直接使用gzip格式(這是我在測試中所做的)。

但是除了期待gzip-stream讀取tar格式之外,其他任何地方都沒有錯誤。

+0

當然。我無法相信這是一個錯誤,這就是我尋求幫助的原因。再次感謝! – PNS

+0

如果你以某種方式顯示你的文件,這可能在一開始就解決了。 (我爲答案添加了一些Java tar鏈接。) –