私は Java BufferedReader オブジェクトを使用して、1,000 行の ASCII テキストを典型的な CSV 形式で含む有効な GZIP アーカイブを指す GZIPInputStream を 1 行ずつ読み取ります。コードは次のようになります。
BufferedReader buffer = new BufferedReader(new InputStreamReader(
new GZIPInputStream(new FileInputStream(file))));
file は、アーカイブを指す実際の File オブジェクトです。
私は呼び出してすべてのファイルを読みました
int count = 0;
String line = null;
while ((line = reader.readLine()) != null)
{
count++;
}
リーダーは期待どおりにファイルを調べますが、最後に行 #1000 をバイパスし、もう 1 行読み取ります (つまり、ループの終了後にカウント = 1001)。
最後の行でline.length()を呼び出すと、多数 (4,000 以上) の文字が報告され、それらはすべて印刷できません ( Character.getNumericValue()は -1 を返します)。
実際、line.getBytes()を実行すると、結果の byte[] 配列には同じ数の NULL 文字 ('\0') が含まれます。
これは BufferedReader のバグのように見えますか?
いずれにしても、この動作を回避するための回避策を提案してもらえますか?
編集:さらに奇妙な動作: 読み取られる最初の行には、ファイル名、いくつかの NULL 文字 ('\0')、および行のユーザー名とグループ名がプレフィックスとして付けられ、その後に実際のテキストが続きます!
編集: 少なくとも私のプラットフォームでは、上記の効果を再現する非常に単純なテスト クラスを作成しました。
編集:どうやら誤報のようです。私が取得していたファイルはプレーンな GZIP ではなく、tar された GZIP であったため、これで説明できます。さらにテストする必要はありません。みんな、ありがとう!