读取文件到byte []时出现OutOfMemory错误

时间:2014-05-17 10:13:57

标签: java android file out-of-memory bytearray

我正在尝试读取byte []中的视频文件,然后加密它们。相对较大的文件,即超过30 mb,会给出内存不足的异常。这是我用来将文件读取到byte []的代码:

FileInputStream fin=new FileInputStream(file);
byte[] fileContent = new byte[(int)file.length()];
fin.read(fileContent);

这是我得到的错误:

05-17 05:54:59.356: E/AndroidRuntime(4082): FATAL EXCEPTION: main
05-17 05:54:59.356: E/AndroidRuntime(4082): java.lang.OutOfMemoryError
05-17 05:54:59.356: E/AndroidRuntime(4082):     at com.vencrypto.ExplorerActivity$3.onItemClick(ExplorerActivity.java:136)
05-17 05:54:59.356: E/AndroidRuntime(4082):     at android.widget.AdapterView.performItemClick(AdapterView.java:298)
05-17 05:54:59.356: E/AndroidRuntime(4082):     at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
05-17 05:54:59.356: E/AndroidRuntime(4082):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2788)
05-17 05:54:59.356: E/AndroidRuntime(4082):     at android.widget.AbsListView$1.run(AbsListView.java:3463)
05-17 05:54:59.356: E/AndroidRuntime(4082):     at android.os.Handler.handleCallback(Handler.java:730)
05-17 05:54:59.356: E/AndroidRuntime(4082):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-17 05:54:59.356: E/AndroidRuntime(4082):     at android.os.Looper.loop(Looper.java:137)
05-17 05:54:59.356: E/AndroidRuntime(4082):     at android.app.ActivityThread.main(ActivityThread.java:5103)
05-17 05:54:59.356: E/AndroidRuntime(4082):     at java.lang.reflect.Method.invokeNative(Native Method)
05-17 05:54:59.356: E/AndroidRuntime(4082):     at java.lang.reflect.Method.invoke(Method.java:525)
05-17 05:54:59.356: E/AndroidRuntime(4082):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
05-17 05:54:59.356: E/AndroidRuntime(4082):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
05-17 05:54:59.356: E/AndroidRuntime(4082):     at dalvik.system.NativeStart.main(Native Method)

我知道文件太大但必须有正确的方法。

1 个答案:

答案 0 :(得分:0)

不是直接使用FileInputStream,而是将其包装在BufferedInputStream中,这样就不会分配大量的内存。缓冲的输入流以段的形式读取数据,因此您可以加密该块,如果要将其写回文件,请使用BufferedWriter以相同的方式写入该文件。