簡體   English   中英

Java壓縮程序無法完全讀取文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM