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

単にメモリ不足です。ファイルは正しく読み取られます。前述のように、最初のオプションは、アプリで数 kB のヒープ領域を解放できる場所を確認することです。ただし、ファイルが少し大きい場合は、再び同じように壊れる可能性があります。

その質問に答える必要があります。なぜテキスト全体を一度にメモリに入れる必要があるのでしょうか? そして、そうする決定的なポイントが見つからない限り、次の質問に答える必要があります:ファイルの一部をメモリに保持するだけでよいように、ファイルのアルゴリズム/処理/表示をチャンクで作成するにはどうすればよいですか?

そのテキストで何をする必要があるかについての詳細情報があれば、必要に応じて別の方法でそれを行う方法についての入力が得られます。


編集:

編集テキストでファイルの内容全体を一度に表示する代わりに、たとえばページを表示することができます: ファイルの一部 (たとえば 100 行) を読み取ります。ユーザーが現在のページの一番下に到達したら、ファイルから次の 100 行を読み込みます (もちろん、前の 100 行は破棄します)。

これは ViewPager でうまく行うことができます (各フラグメントは 100 行を表示し、左にスワイプするとテキストの次のページが表示されます...)

最初は、(テキストを保存せずに) 行の総数を数えるためにファイル全体を調べて、何ページになるかを示したいと思うかもしれません。

于 2013-02-05T07:48:18.297 に答える
1

ファイルの読み取りに関するものではありません。文字列が非常に大きく、メモリに格納できないため、メモリが不足しています。メモリを解放するか (未使用のデータを削除しますが、それほど多くはありません)、プログラム構造を変更してみてください。

于 2013-02-05T07:30:39.533 に答える