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で書き込むようにする、ということです。