在我的应用程序中,我将文件路径提供给FileInputStream类,之后我想要它 转换为字节数组,但它抛出内存不足请建议我如何 要做到这一点。我事先在这里发布了代码。
public byte[] readBytes(InputStream inputStream) throws IOException
{
ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int len = 0;
while ((len = inputStream.read(buffer)) != -1)
{
byteBuffer.write(buffer, 0, len);
}
return byteBuffer.toByteArray();
}
答案 0 :(得分:4)
它失败了,因为在您测试的设备上,您可以使用大约20MB的堆。当它失败时,您的应用程序已经使用了13.5MB的内存。当您尝试将ByteArrayOutputStream
转换为byte array
时,它会尝试分配一个新的~7MB大小byte[]
,因为内存不足而失败。一种解决方法是通过重用byte[]
的内部ByteArrayOutputStream
来避免此新分配。遗憾的是,无法从外部访问它,因此您需要创建自己的方式:
首先创建 MyByteArrayOutputStream.java :
public MyByteArrayOutputStream extends ByteArrayOutputStream {
@Override
public synchronized byte[] toByteArray() {
return buf;
}
}
在您的代码中:
public byte[] readBytes(InputStream inputStream) throws IOException
{
MyByteArrayOutputStream byteBuffer = new MyByteArrayOutputStream(); // note the change!
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int len = 0;
while ((len = inputStream.read(buffer)) != -1)
{
byteBuffer.write(buffer, 0, len);
}
inputStream.close(); // hopefully this will release some more memory
return byteBuffer.toByteArray();
}
请注意,大视频仍会失败。最理想的是,您应该尝试以较小的块上传大文件。
答案 1 :(得分:0)
看起来很直接,视频文件太大而无法放入内存中。您是否100%确定需要将整个文件放入内存中?这通常是一个糟糕的设计理念。