2010-11-25 38 views
4

「Google it」と言う前に、いくつか興味深い記事を見つけましたが、何も機能しませんでした。Java mp3入力ストリームをバイト配列に変換しますか?

私は、ウェブサイトからバイトストリームにmp3ファイルを変換する必要があります。後でファイルにローカルで保存することができます。

Url url = new Url("someUrl"); 
URLConnection conn = url.openConnection(); 
byte[] result = inputStreamToByteArray(conn.getInputStream()); 
// .... some code here 
byteArrayToFile(result, "tmp.mp3"); 

public byte[] inputStreamToByteArray(InputStream inStream){ 
    InputStreamReader in = new InputStreamReader(inStream): 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

    int next = inStream.read(); 
    while (next > -1){ 
     baos.write(next); 
     next = in.read(); 
    } 

    byte[] result = baos.toByteArray(); 
    baos.flush(); 
    in.close(); 
    return result; 
} 

public void byteArrayToFile(byte[] byteArray, String outFilePath){ 
    FileOutputStream fos = new FileOutputStream(outFilePath); 
    fos.write(byteArray); 
    fos.close() 
} 

コードがエラーなしでコンパイル:

は、ここに私のコード(最も重要な部分)です。 URLへの接続が有効です。適切な応答を送信します。

問題は変換のどこかにあります。 byteArrayToFile()の後ろに適切な長さの新しいファイルがディスクにもありますが、どのプレーヤーでも再生できません。長さ00:00と再生されません。ところで

。私は第三者libsを避けたいと思います。他に何も機能していない場合でも...

答えて

12

(あなたがを提示したコードはは仕方によって、エラーなしでコンパイルされないでしょう。あなたが必要な例外処理を持っていない、とinputStreamInputStreamする必要があり、ちょうどスタータ用。あなたは、バイナリストリームから読み込まれ、テキストに変換しようとしている

InputStreamReader in = new InputStreamReader(inStream): 

:)

これが問題です。 テキストではありません。 MP3ファイルのようなバイナリデータの場合、 "Reader"や "Writer"とは何も関係がありません。ここで

は、あなたのinputStreamToByteArray方法がどのように見える(またはGuavaとそのByteStreams.toByteArray methodを使用する)べきだ:私は、入力ストリームをクリーンアップする呼び出し側のためにそれを残してきた

public byte[] inputStreamToByteArray(InputStream inStream) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    byte[] buffer = new byte[8192]; 
    int bytesRead; 
    while ((bytesRead = inStream.read(buffer)) > 0) { 
     baos.write(buffer, 0, bytesRead); 
    } 
    return baos.toByteArray(); 
} 

注意。通常、ストリームを取得した人はそれを閉じます。このような方法では、IMO自体が少し奇妙になります。もしあなたがそうしたいならば、おそらくfinallyブロックにありますので、例外がスローされてもは常にになることがわかります。

「書き込み」コードは後で例外がある場合でもファイルを閉じることはないことに注意してください。 finallyブロックのストリームを常に閉じるという習慣を身につけるべきです。

+0

ありがとうございます。はい、私は例外処理を持って、ちょうど私のポストのコードでそれを書いていない。 Btw。とにかくダイナミックなサイズのバッファを取得するには?たとえば、リストを使用して、それを返すときに配列に変換するとしますか? – ZolaKt

+0

@ ZolaKt:ByteArrayOutputStreamという動的なサイズのバッファがあります。 8Kバッファーは非常に一時的なストレージとして存在します。なぜあなたは動的にサイズを変えたいのですか? –

+0

私は知らない。私はちょうど "ハードコードされた"数字が好きではない:)しかし、あなたは正しい、これは行く方法です。どうもありがとうございました。 – ZolaKt

関連する問題