Javaのbyte配列の扱いでゴミが入るパターン。
スポンサーリンク
OutputStreamに書き込むときにゴミが入ってしまう
InputStreamから読み込むたびにOutputStreamに書き込むようなコードは、Javaではよくやると思います。
ですがそのときに、書き込み範囲を指定しないとやはりbyte配列分の0x00が書き込まれてゴミになってしまう。
例えばこういうコードです。
String input_file = "C:\\tmp\\input.dat";
String output_file = "C:\\tmp\\output.dat";
BufferedInputStream bis = new BufferedInputStream( new FileInputStream(input_file));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(output_file));
byte[] buf = new byte[1024];
while( bis.read(buf) != -1 ) {
bos.write(buf);
}
bos.flush();
bis.close();
bos.close();
C:\tmp\input.datは
abcde
だけの5バイトのファイルとします。
これを実行するとC:\tmp\output.datが生成されますが、内容は「abcde」の後が0x00で埋められた、1024バイトのファイルになります。
必要な長さだけ書き込むようにする
これもbyte配列ぶんだけ書き込まれてしまっているのが原因で、while文のところを次のように直すと解消されます。
int len = 0;
while( (len=bis.read(buf)) != -1) {
bos.write(buf, 0, len);
}
readで読み込んだ長さだけwriteで書き込むようにする、ということです。