在你说“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,不会播放。
顺便说一下。我想避免任何第三方库。但如果没有别的办法......
答案 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
块中关闭流的习惯。