Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将文件读取到字节[]时发生OutOfMemory错误_Java_Android_File_Out Of Memory_Bytearray - Fatal编程技术网

Java 将文件读取到字节[]时发生OutOfMemory错误

Java 将文件读取到字节[]时发生OutOfMemory错误,java,android,file,out-of-memory,bytearray,Java,Android,File,Out Of Memory,Bytearray,我正在尝试读取字节[]中的视频文件,然后对其进行加密。相对较大(即大于30 mb)的文件出现内存不足异常。下面是我用来将文件读取到字节[]的代码: FileInputStream fin=new FileInputStream(file); byte[] fileContent = new byte[(int)file.length()]; fin.read(fileContent); 这就是我得到的错误: 05-17 05:54:59.356: E/AndroidRuntime(4082):

我正在尝试读取字节[]中的视频文件,然后对其进行加密。相对较大(即大于30 mb)的文件出现内存不足异常。下面是我用来将文件读取到字节[]的代码:

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)

我知道文件太大了,但一定有正确的方法。

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

与其尝试分配文件大小的数组,不如分配一个可管理大小的数组,例如,2MB,并使用一个循环,一次处理一个块,在处理过程中将块写入文件输出流。重要的是不要试图一次将其全部放入
字节[]
。一次处理文件的较小部分,或者使用输入/输出流本身执行所有操作。请详细说明一下方法。我想我也需要为此创建字节数组,错误就在我创建字节[]的那一行。@Sourabh不,你不需要创建字节数组。使用
新的BufferedInputStream(new FileInputStream())
(使用您使用的参数)创建一个
BufferedInputStream
。请查看BufferedInputStream。在
BufferedInputStream
中,它以小段读取数据,这是处理数据的方式,而不是一个巨大的
字节[]