优化从AudioInputStream到ByteArrayOutputStream的重写

时间:2015-03-18 12:22:39

标签: java audio mp3 inputstream bytearrayoutputstream

stackoverflow上几乎没有类似的主题,但对我来说它们似乎都不够好。问题是我有这样一段代码:

        // AudioInputStream in;
        final int BUFFER_SIZE = 8192;
        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        byte[] byteBuffer = new byte[BUFFER_SIZE];
        int bytesRead = 0;

        while ((bytesRead = in.read(byteBuffer, 0, BUFFER_SIZE)) != -1) {
            byteStream.write(byteBuffer, 0, bytesRead);
        }
        byte[] audioData = byteStream.toByteArray();

此代码读取mp3文件的数据并将其保存到字节数组,但大约需要10秒。有没有可能在短时间内将整个mp3数据存储到缓冲区? 我试图避免传递缓冲区的大小或扩展它,但这会导致其他问题(例如文件未正确读取)。

提前致谢

1 个答案:

答案 0 :(得分:0)

您正在复制数据3次,您可以通过首先检查文件大小,分配足够大的字节数组并直接读取数据来避免这种情况。 它还有助于在ByteArrayOutputStream中预先分配空间,因此它不必多次增加大小。

如果你无法预先获得文件大小,你可以为每个块分配一个新的byte [],并将它们放在一个列表中,直到你得到它们为止。然后分配最终数组并将它们全部复制到最后一个数组中。 IF 最后需要一个byte []。如果你不这样做,可能会有更有效的方法继续下去。