2011-01-06 5 views
1

私は、私のためにオーディオファイルをダウンロードするJavaプログラムを作成しました。私はBufferedInputStreamを使用しています。 read()関数は正常に動作しますが、実際には遅いので、オーバーロードされたバージョンをbyte []を使って試してみました。BufferedInputStream.read(byte [])問題を引き起こします。誰もがこの問題を以前に持っていますか?

何らかの理由で、ダウンロード後に音声が壊れて奇妙になります。私は何が間違っているのか完全にはわからないので、どんな助けもありがたいです!ここでは単純化した、コードのちょっとしたバージョンです。

BufferedInputStream bin = new BufferedInputStream((new URL(url)).openConnection().getInputStream()); 
File file = new File(fileName); 
FileOutputStream fop = new FileOutputStream(file); 
int rd = bin.read(); 
while(rd != -1) 
{ 
    fop.write(rd); 
    rd = bin.read(); 
} 

答えて

6

バイト単位で読み込むと、実際に受信したバイト数が返されることに注意してください。バイト配列に無関係のデータがある可能性があるため、その数を渡す必要があります。これは、データの最後のブロックで特に当てはまります。

+0

ああ私は...間違ったミスです!私にそれを指摘してくれてありがとう! :D –

+0

それは私たちの最高に起こる!私はこれが私に2回以上起きたことがありました。通常は画像ファイルが付いているので、コピーされた画像に変なアーティファクトが現れます。最大の症状は、私のファイルサイズがすべて1024の倍数だったということでした。 – Zeki

1

あなたが実際に使用しているreadメソッドは、それが返すintの中に1バイトを返します。つまり、変数 "rd"の32ビットのうちの8ビットだけが実際に使用されます。

メソッドwriteは、引数としてintをとりますが、 "指定されたバイトをこのファイルの出力ストリームに書き込む"と記述します。これはあなたが大丈夫になるはずだということを意味します。しかし、私はあなたがDではないと思っています。

代わりにバイト配列を引数として取るreadメソッドを使って、そのバイト配列を出力ストリームに書き込みます。

ただし、この他の読み取り方法は、バイト配列を引数として取り、intも返すことに注意してください。 (入力データからバイトの1つを返す)あなたの例で使用しているメソッドとは異なり、この他のreadメソッドは読み込まれたバイト数を返します。バイト配列に含めることができるバイト数である必要はありません。その場合、実際に最後に読み取られたバイト数より多くのバイトを出力ストリームに書き込まないようにする必要があります。

関連する問題