java mp3输入流到字节数组?

Zol*_*aKt 4 java mp3 bytearray file stream

在你说"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()
}
Run Code Online (Sandbox Code Playgroud)

代码编译没有错误.与网址的连接有效.它发送正确的答复.

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

顺便说一句.我想避免任何第三方库.但如果没有其他工作......

Jon*_*eet 12

(顺便提一下,你提出的代码不会没有错误地编译.你没有得到必要的异常处理,而且inputStream应该InputStream只是为了初学者.)

这就是问题:

InputStreamReader in = new InputStreamReader(inStream):
Run Code Online (Sandbox Code Playgroud)

您正在尝试从二进制流中读取,并将其转换为文本.这不是文字.您不应该使用任何与"Reader"或"Writer"有关的二进制数据,如MP3文件.

这是您的inputStreamToByteArray方法应该是什么样的(或使用Guava及其ByteStreams.toByteArray方法):

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();
}
Run Code Online (Sandbox Code Playgroud)

请注意,我已将其留给调用者清理输入流.通常,任何获取流的人也会关闭它 - 对于像这样的方法来关闭它本身有点奇怪,IMO.如果你愿意,你可以这样做,但可能在一个finally区块中,所以你知道即使抛出异常也会一直关闭它.

请注意,如果出现异常,稍后您的"编写"代码也不会关闭文件.你应该养成总是在finally块中关闭流的习惯.