2014-05-17 81 views
0

我想讀取一個字節[]中的視頻文件,然後加密它們。比較大的文件,即大於30MB的文件會導致內存異常。下面是我使用的讀取文件爲byte []代碼:OutOfMemory讀取文件到字節錯誤[]

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

而不是試圖分配一個數組文件的大小,分配一個管理大小的數組,例如, 2MB,並使用循環一次處理一個文件塊,隨着時間將塊寫入文件輸出流。 – Barend

回答

0

不是直接使用FileInputStream,而是將其包裝在BufferedInputStream中,以免分配大量內存。緩衝的輸入流以段的形式讀取數據,因此您可以對該段進行加密,並且如果將它寫回文件,則使用BufferedWriter以相同的方式寫入該文件。

+2

重要的部分是不要嘗試一次將它全部放入'byte []'中。一次處理文件的較小部分,或者使用輸入/輸出流本身執行所有操作。 –

+0

可否請您詳細說明一下方法。我想我也需要爲此創建字節數組,錯誤在我創建字節[]的那一行。 – Sourabh

+0

@Sourabh不,你不需要創建一個字節數組。通過使用'新BufferedInputStream(新FileInputStream())'(使用您已使用的參數)創建一個'BufferedInputStream'。看看BufferedInputStream [JavaDoc](http://docs.oracle.com/javase/7/docs/api/java/io/BufferedInputStream.html)。在'BufferedInputStream'裏面,它以小段讀取數據,這就是你應該如何處理你的數據,而不是一個巨大的'byte []'。 – The6P4C