内存异常

时间:2011-12-07 09:15:06

标签: android

在我的应用程序中,我将文件路径提供给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();
}  

2 个答案:

答案 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%确定需要将整个文件放入内存中?这通常是一个糟糕的设计理念。