base64 でエンコードされた大きなデータがいくつかあります (hadoop ファイルシステムのスナップ ファイルに格納されています)。このデータはもともと gzip されたテキスト データでした。このエンコードされたデータのチャンクを読み取り、デコードして、GZIPOutputStream にフラッシュできる必要があります。
base64 データ全体を配列にロードして Base64.decodeBase64(byte[]) を呼び出す代わりに、これを行う方法についてのアイデアはありますか?
「\r\n」区切り文字まで文字を読み取り、1 行ずつデコードすれば正しいでしょうか? 例:
for (int i = 0; i < byteData.length; i++) {
if (byteData[i] == CARRIAGE_RETURN || byteData[i] == NEWLINE) {
if (i < byteData.length - 1 && byteData[i + 1] == NEWLINE)
i += 2;
else
i += 1;
byteBuffer.put(Base64.decodeBase64(record));
byteCounter = 0;
record = new byte[8192];
} else {
record[byteCounter++] = byteData[i];
}
}
残念ながら、このアプローチでは人間が読める出力は得られません。理想的には、データの読み取り、デコード、およびストリーミングをストリーミングしたいと考えています。
今、入力ストリームに入れてから gzipout にコピーしようとしています
byteBuffer.get(bufferBytes);
InputStream inputStream = new ByteArrayInputStream(bufferBytes);
inputStream = new GZIPInputStream(inputStream);
IOUtils.copy(inputStream , gzipOutputStream);
そして、それは私に java.io.IOException: Corrupt GZIP Trailer を与えます