Android 内存不足异常
在我的应用程序中,我给FileInputStream类提供视频文件路径,然后我想要它 若要转换为字节数组,但它抛出内存不足异常,请建议我如何转换 我把代码贴在这里,提前谢谢Android 内存不足异常,android,Android,在我的应用程序中,我给FileInputStream类提供视频文件路径,然后我想要它 若要转换为字节数组,但它抛出内存不足异常,请建议我如何转换 我把代码贴在这里,提前谢谢 public byte[] readBytes(InputStream inputStream) throws IOException { ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); int bufferSi
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();
}
看起来很简单,视频文件太大,无法放入内存。您是否100%确定需要将整个文件放在内存中?这通常是一个糟糕的设计概念。似乎很简单,视频文件太大,无法放入内存。您是否100%确定需要将整个文件放在内存中?这通常是一个糟糕的设计概念。它失败了,因为在您正在测试的设备上,您可以使用大约20MB的堆。当它失败时,你的应用程序已经使用了13.5MB的内存。当您试图将
ByteArrayOutputStream
转换为字节数组
时,它试图分配一个新的~7MB大小字节[]
,但由于内存不足而失败。一种解决方法是通过重用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();
}
请注意,对于大型视频,这仍然会失败。最佳情况下,您应该尝试以较小的块上载大文件。它失败了,因为在您正在测试的设备上,您可以使用大约20MB的堆。当它失败时,你的应用程序已经使用了13.5MB的内存。当您试图将ByteArrayOutputStream
转换为字节数组
时,它试图分配一个新的~7MB大小字节[]
,但由于内存不足而失败。一种解决方法是通过重用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();
}
请注意,对于大型视频,这仍然会失败。您最好尝试以较小的块上载大文件。跳过此处的错误日志和代码。。与其下载整个视频文件,不如使用流媒体直播!!此外,我还没有使用DownloadManager,所以我不知道DownloadManager是否处理这种类型的下载,但您可以尝试一下。感谢您的快速回复,该文件没有那么大,只有7MB。显示内存不足的Fowling错误的logcat:Heap Size=13575KB,Allocated=6793KB,Bitmap Size=14KB,Limit=20480KB 12-07 15:39:05.207:error/dalvikvm(5132):额外信息:Footprint=13575KB,Allowed Footprint=13575KB,Trimmed=816KB 12-07 15:39:05.217:error/AndroidRuntime(5132):Thread-10 1 java.lang.outofmemory错误:(Heap Size=13575KB,Allocated=6793KB,Bitmap Size=14KB)12-07 15:39:05.217:ERROR/AndroidRuntime(5132):位于java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91)实际上,我的目标是将一段视频从SD卡上传到facebook,因为我正在转换为字节数组。@Rekha请尝试一下我的回答,跳过您的错误日志和代码。.下载整个视频文件,为什么不使用实时流媒体!!而且我还没有使用DownloadManager,所以我不知道DownloadManager是否处理这种类型的下载ot,但您可以尝试一下。感谢快速回复,该文件没有那么大,只有7 mb。logcat显示内存不足的Fowling错误:堆大小=13575KB,分配=6793KB,位图大小=14KB,限制=20480KB 12-07 15:39:05.207:error/dalvikvm(5132):额外信息:Footprint=13575KB,Allowed Footprint=13575KB,Trimmed=816KB 12-07 15:39:05.217:ERROR/AndroidRuntime(5132):Thread-10 1 java.lang.outofmemory错误:(Heap Size=13575KB,Allocated=6793KB,Bitmap Size=14KB)12-07 15:39:05.217:ERROR/AndroidRuntime(5132):at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91)实际上,我的目标是从SD卡上传一段视频到facebook,因为我正在转换成字节数组。@Rekha请尝试一下我的答案