Java/Android读取大型文本文件(~2.5 MB)

Java/Android读取大型文本文件(~2.5 MB),java,android,io,nio,out-of-memory,Java,Android,Io,Nio,Out Of Memory,我正在尝试使用以下代码将一个大文本文件(~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 b

我正在尝试使用以下代码将一个大文本文件(~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:

我运行过亚洲开发银行,发现如下情况:

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)
04-12 20:41:48.905 6610 6610 E AndroidRuntime:致命异常:主
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.dynamiclayot.reflow(dynamiclayot.java:336)
04-12 20:41:48.905 6610 6610 E AndroidRuntime:at-android.text.DynamicLayout.(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:在com.ultimate Computers Services上的C.androidhelloworld.HelloWorld$1$1.run(HelloWorld.java:183)
04-12 20:41:48.905 6610 6610 E AndroidRuntime:at android.os.handle.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.Invokenactive(本机方法)
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:com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-12 20:41:48.905 6610 6610 E AndroidRuntime:com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-12 20:41:48.905 6610 6610 E AndroidRuntime:在dalvik.system.NativeStart.main(本地方法)

你的应用程序实际上并没有捕获任何异常,它只是在崩溃时清理资源

将catch(异常e){}添加到try/finally以捕获异常


我有一个应用程序,我曾经加载1MB的文件,这不是问题(尽管DOM解析器是)

请在日志中打印异常详细信息并发布结果。这样做:

catch( Exception err) {

    Log.e("There was an error reading the file", err);
}
这将为您提供一些更有意义的消息,解释发生了什么,以及正在执行的方法的跟踪

那么,我们可能会进一步帮助你


当我用DOM解析器解析2.5MB文件时,出现内存不足异常。。。但我不认为你这么做是因为这可能是另一个问题。无论如何,我通过将数据拆分成几个文件并一次解析一个文件来解决我的问题~1MB是文件的“安全”大小。

是的,在文件的这一部分之外,我知道我在做什么。@Richard J.Ross IlL:你为什么不看看logcat,看看崩溃信息是什么?发布它以检查问题是否为OutOfMemoryError。您是在设备上运行还是在模拟器上运行?@Kurru我正在设备上运行。我在哪里可以得到logcat文件?@Richard J.Ross Ill:logcat是eclipse中Android消息的一个视图。每当应用程序强制关闭时,它都会将崩溃数据发送到那里。此外,您可以使用
android.util.Log
类将信息写入LogCat。打开DDMS透视图,它应该被默认值包含在那里,也许我让您感到困惑。我没有以正常方式部署到设备,例如,没有直接挂接到eclipse。我正在使用构建的APK部署到设备,目前无法以任何其他方式进行部署。但是,如果这有什么区别的话,设备是根目录的……日志文件存储在哪里?你应该使用android工具:logcat。要运行它,启动控制台,转到android SDK安装文件夹,输入“工具”文件夹并执行“adb logcat”。如果您喜欢GUI(它在同一个文件夹中),可以使用DDMS。我更喜欢Logcat。此外,如果您使用的是eclipse,DDMS将集成到其中。你应该把它放在调试视图或其他什么东西上。链接:通过USB将您的设备与安装了Android SDK的pc连接。然后,您可以使用名为“adb”的SDK工具(文件夹平台工具中)获取日志。比如:adb-d logcat。我不知道您以前是否必须在手机上打开调试模式。eclipse外部调试的链接:然后将手机插入安装了Android SDK的MAC并使用adb logcat.:)我相信9号信号只是信号。是th吗