java mp3输入流到字节数组?

时间:2010-11-25 20:09:00

标签: java file stream mp3 bytearray

在你说“Google it”之前,我试过,发现了一些有趣的文章,但没有任何效果。

我需要将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()
}

代码编译没有错误。 与网址的连接有效。它会发出正确的回复。

问题出在转换的某个地方。 我也在byteArrayToFile()之后使用适当的长度在磁盘上获取新文件,但我不能在任何播放器中播放它。它说长度为00:00,不会播放。

顺便说一下。我想避免任何第三方库。但如果没有别的办法......

1 个答案:

答案 0 :(得分:12)

(顺便说一句,你提交的代码不会编译而没有错误。你没有得到必要的异常处理,inputStream应该是InputStream ,仅限初学者。)

这是问题所在:

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块中关闭流的习惯。