[英]Java compressor not reading file completely
我們在用Java解壓縮bz2文件時遇到一個問題,即輸入流在讀取〜3%的文件后認為已完成。
我們歡迎任何有關如何解壓縮和讀取必須逐行處理的大型bz2文件的建議。
這是到目前為止我們所做的詳細信息:
例如,bz2文件的大小為2.09 GB,未壓縮的文件大小為24.9 GB
下面的代碼僅讀取文件實際包含的1000萬行中的343,800行。
修改代碼以將bz2解壓縮為文本文件(直接將FileInputStream壓縮到CompressorInputStream中)將產生約190 MB的文件-與bz2文件的大小無關。 我嘗試將緩沖區值設置為2048字節,但這對結果沒有影響。
我們已經在Windows 64位和Linux / CentOS上執行了相同的結果。
緩沖的讀取器能否進入空的“空”行並導致代碼退出while循環?
import org.apache.commons.compress.compressors.*;
import java.io.*;
...
CompressorInputStream is = new CompressorStreamFactory()
.createCompressorInputStream(
new BufferedInputStream(
new FileInputStream(filePath)));
lineNumber = 0;
line = "";
br = new BufferedReader(
new InputStreamReader(is));
while ((line = br.readLine()) != null) {
this.processLine(line, ++lineNumber);
}
即使此代碼在到達流的末尾時強制執行異常,其結果也完全相同:
byte[] buffer = new byte[1024];
int len = 1;
while (len == 1) {
out.write(buffer, 0, is.read(buffer));
out.flush();
}
您的代碼顯然沒有錯; 它應該工作。 這意味着問題一定在其他地方。
嘗試啟用日志記錄(即在處理時打印行)。 確保輸入中沒有空格(也許將這些行寫入新文件並進行比較)。 使用bzip2 --test
來確保輸入文件沒有錯誤。 檢查同一行是否總是失敗(也許輸入包含奇數字符或二進制數據?)
問題出在bz2文件上:它們是使用Hadoop版本創建的,該版本的文件內部包含錯誤的塊頭。
當前的Java解決方案對此感到迷st,而其他人則忽略或以某種方式處理它。
將尋找解決方案/解決方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.