3

我正在从 SD 卡读取文本文件。如果文件大小很小,我的代码可以工作,但是当文件大于 4 或 5 mb 时,它会给我一个错误。

这是我使用的代码:

File myFile = new File(""+listAllSdCardFile.get(filePostion));
BufferedReader br1 = new BufferedReader( new FileReader( myFile ) );
StringBuffer text = new StringBuffer();
for(String line; (line=br1.readLine())!=null;)
{
    text.append( line );
}
line=text.toString();

这是我得到的错误:

02-05 07:12:55.184: E/AndroidRuntime(778): FATAL EXCEPTION: Background
02-05 07:12:55.184: E/AndroidRuntime(778): java.lang.OutOfMemoryError
02-05 07:12:55.184: E/AndroidRuntime(778):  at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:97)
02-05 07:12:55.184: E/AndroidRuntime(778):  at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:157)
02-05 07:12:55.184: E/AndroidRuntime(778):  at java.lang.StringBuffer.append(StringBuffer.java:215)
02-05 07:12:55.184: E/AndroidRuntime(778):  at com.reader.fastreader.TextReader.StringSpilitFunction(TextReader.java:344)
02-05 07:12:55.184: E/AndroidRuntime(778):  at com.reader.fastreader.TextReader$3$1$1.run(TextReader.java:134)
02-05 07:12:55.184: E/AndroidRuntime(778):  at java.lang.Thread.run(Thread.java:1096)
02-05 07:12:55.784: E/WindowManager(778): Activity com.reader.fastreader.TextReader has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44f74708 that was originally added here
02-05 07:12:55.784: E/WindowManager(778): android.view.WindowLeaked: Activity com.reader.fastreader.TextReader has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44f74708 that was originally added here
02-05 07:12:55.784: E/WindowManager(778):   at android.view.ViewRoot.<init>(ViewRoot.java:247)
02-05 07:12:55.784: E/WindowManager(778):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
02-05 07:12:55.784: E/WindowManager(778):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
02-05 07:12:55.784: E/WindowManager(778):   at android.view.Window$LocalWindowManager.addView(Window.java:424)
02-05 07:12:55.784: E/WindowManager(778):   at android.app.Dialog.show(Dialog.java:241)
02-05 07:12:55.784: E/WindowManager(778):   at com.reader.fastreader.TextReader$3$1.onItemClick(TextReader.java:140)
02-05 07:12:55.784: E/WindowManager(778):   at android.widget.AdapterView.performItemClick(AdapterView.java:284)
02-05 07:12:55.784: E/WindowManager(778):   at android.widget.ListView.performItemClick(ListView.java:3382)
02-05 07:12:55.784: E/WindowManager(778):   at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
02-05 07:12:55.784: E/WindowManager(778):   at android.os.Handler.handleCallback(Handler.java:587)
02-05 07:12:55.784: E/WindowManager(778):   at android.os.Handler.dispatchMessage(Handler.java:92)
02-05 07:12:55.784: E/WindowManager(778):   at android.os.Looper.loop(Looper.java:123)
02-05 07:12:55.784: E/WindowManager(778):   at android.app.ActivityThread.main(ActivityThread.java:4627)
02-05 07:12:55.784: E/WindowManager(778):   at java.lang.reflect.Method.invokeNative(Native Method)
02-05 07:12:55.784: E/WindowManager(778):   at java.lang.reflect.Method.invoke(Method.java:521)
02-05 07:12:55.784: E/WindowManager(778):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-05 07:12:55.784: E/WindowManager(778):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-05 07:12:55.784: E/WindowManager(778):   at dalvik.system.NativeStart.main(Native Method)

我的代码有什么问题?

4

2 回答 2

1

这与文件读取无关。您的内存不足,因为您的字符串非常大,您无法将其存储在内存中。尝试释放内存(删除一些未使用的数据,5也不算多)或改变程序结构。

于 2013-02-05T07:30:39.533 回答
1

你只是内存不足,文件被正确读取。如前所述,第一个选择是查看在哪里可以释放应用程序中的一些 kB 堆空间。但是,如果你有一个稍大的文件,它可能会再次以同样的方式破坏。

你需要回答这个问题:为什么我需要在内存中一次获得整个文本?除非你找到一个明确的点,否则你将需要回答以下问题:我将如何使我的算法/处理/显示文件以块的形式,以便我只需要在内存中保存文件的一部分。

有了有关您需要对该文本做什么的更多信息,您将获得更多关于如何在需要时以另一种方式进行操作的输入。


编辑:

例如,您可以显示页面:读取文件的一部分(例如 100 行),而不是在编辑文本中一次显示整个文件内容。一旦用户到达当前页面的底部,从文件中加载接下来的 100 行(当然,丢弃之前的 100 行)。

您可以使用 ViewPager 很好地做到这一点(每个片段显示 100 行,向左滑动以显示下一页文本,...)

第一次,您可能想要遍历整个文件以计算总行数(不存储文本),从而能够指示可以执行多少页。

于 2013-02-05T07:48:18.297 回答