[英]Java / Android Read large text file (~2.5 MB)
我正在嘗試使用以下代碼將大型文本文件(〜2.5 MB)讀入Android應用程序:
private static String readFile(String path) throws IOException {
FileInputStream stream = new FileInputStream(new File(path));
try {
FileChannel fc = stream.getChannel();
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
/* Instead of using default, pass in a decoder. */
return Charset.defaultCharset().decode(bb).toString();
}
finally {
stream.close();
}
}
我在這里讀到,這是在Java中讀取文件的最有效方法,但是我的應用程序因強制關閉而崩潰,我相信是因為內存不足問題,因為我將這段代碼包裹在try-catch塊中。
我該如何閱讀並不會使應用程序崩潰? 我嘗試了幾種方法,所有方法都相同,但僅適用於大文件。 我無法拆分文件,這在最終應用程序中是不可接受的。
更新:
這是我實際讀取文件的部分:
try
{
String str = readFile(filePath);
et.setText(str);
et.setSelection(str.length());
}
catch (Exception ex)
{
et.setText("There was an error reading the file: " + filePath + "\nDetails: " + ex);
}
其中et
是一個AutoCompleteTextView
更新2:
我已經運行adb並發現以下內容:
04-11 15:26:16.805 20646 20658 W ActivityManager: Activity pause timeout for HistoryRecord{45b37620 com.ultimatecomputerservicesinc.androidhelloworld/.HelloWorld}
04-11 15:26:17.032 20727 20727 D dalvikvm: GC_EXTERNAL_ALLOC freed 1202 objects / 51792 bytes in 66ms
-- snip --
04-11 15:26:20.868 20727 20727 D dalvikvm: GC_EXTERNAL_ALLOC freed 639 objects / 25048 bytes in 38ms
04-11 15:26:20.961 25842 25842 I Process : Sending signal. PID: 25842 SIG: 9
04-11 15:26:21.102 20727 20727 D dalvikvm: GC_EXTERNAL_ALLOC freed 626 objects / 24328 bytes in 93ms
04-11 15:26:21.141 20646 20650 I ActivityManager: Process com.ultimatecomputerservicesinc.androidhelloworld (pid 25842) has died.
信號9是什么意思?
更新3
我的猜想是正確的,我的記憶力不足了! 如何增加android上的JVM大小?
04-12 20:41:48.905 6610 6610 E AndroidRuntime: FATAL EXCEPTION: main
04-12 20:41:48.905 6610 6610 E AndroidRuntime: java.lang.OutOfMemoryError
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at android.text.PackedIntVector.growBuffer(PackedIntVector.java:257)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at android.text.PackedIntVector.insertAt(PackedIntVector.java:187)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at android.text.DynamicLayout.reflow(DynamicLayout.java:336)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at android.text.DynamicLayout.<init>(DynamicLayout.java:150)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at android.widget.TextView.makeNewLayout(TextView.java:4987)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at android.widget.TextView.checkForRelayout(TextView.java:5484)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at android.widget.TextView.setText(TextView.java:2776)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at android.widget.TextView.setText(TextView.java:2644)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at android.widget.EditText.setText(EditText.java:75)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at android.widget.TextView.setText(TextView.java:2619)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at com.ultimatecomputerservicesinc.androidhelloworld.HelloWorld$1$1.run(HelloWorld.java:183)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:587)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:92)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at android.os.Looper.loop(Looper.java:143)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:4701)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:521)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-12 20:41:48.905 6610 6610 E AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
您的應用實際上並沒有捕獲任何異常,它只是在崩潰時清理資源。
將catch(Exception e){}添加到try / finally以捕獲異常。
我有一個應用程序,我曾經加載過1MB的文件,這不是問題(盡管DOM解析器是)
請在日志中打印異常詳細信息並發布結果。 做這樣的事情:
catch( Exception err) {
Log.e("There was an error reading the file", err);
}
這應該給您一些更有意義的消息,以解釋發生了什么,並跟蹤正在執行的方法。
然后,我們可能會幫助您進一步。
當我使用DOM解析器解析2.5 MB文件時,我的內存不足異常。但是我不認為您會這樣做,所以這可能是另一個問題。 無論如何,我通過將數據分成多個文件並一次解析一個文件來解決了我的問題。 大約1MB是文件的“安全”大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.