2

50 mbのデータを含む大きなファイルがあります。jTextArea()を読み取って追加したいと思います。しかし、データを追加しているときに*メモリエラー*から抜け出しています。どうすればよいですか?誰か助けてください

例:

BufferedReader br;
        StringBuilder builder = new StringBuilder();
        try {
            br = new BufferedReader(new FileReader("D:\\myFile.txt"));
            String line;
            try {
                while ((line = br.readLine()) != null) {
                   // process the line.
                    builder.append(line);// here getting error
                }
                System.out.println(builder.toString());

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                br.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
JTextArea jt = new JtextArea();
jt.append(builder.toString();
4

4 に答える 4

2

最大ヒープサイズを増やすか、パギネーターデザインパターンを使用することができます。

ページネーションは、実際に表示されているデータのみをロードすることで機能します。したがって、テキスト領域に2ページのテキストを表示できる場合は、一度に2ページのテキストのみをロードします。ユーザーが下にスクロールすると、読み込まれたページが破棄され、新しい2つのページが読み込まれます。そうすれば、メモリには常に2ページしかありません。

于 2012-11-15T11:11:17.653 に答える
1

に追加する50MBのテキストを読むユーザーがいるとは思えませんJTextArea

ある種のページ付けを実装し、一度に数百または数千の行を追加することをお勧めします。

ただし、本当にすべてのテキストを追加したい場合-Xmxは、アプリケーションのパラメーターをより高い値に設定してください。

于 2012-11-15T11:10:28.763 に答える
1

JVMの最大サイズを設定してみてください

于 2012-11-15T11:08:21.843 に答える
0

使いやすさの点で実用的でないことを無視すると(そしてJTextAreaはおそらくそれほど多くのテキストではうまく機能しないでしょう)、必要なメモリの量を減らすためにコードにいくつかの変更を加えることができます(おそらく-Xmxを増やす必要があります)。

最初のレバーは、StringBuilderに入れたいデータの量に合わせてStringBuilderのサイズを適切に設定することです。新しいStringBuilder()新しいStringBuilder(sizeOfFile)に置き換えると、必要以上のメモリが割り当てられるのを防ぐことができます(StringBuildersの内部メモリ割り当てポリシーメソッドにより、これにより数MBの違いが生じる可能性があります)。

builder.toString()を実行する場合、ビルダー内のすべてが文字列を作成するためにコピーされるため、これにより必要なメモリ量が2倍になることに注意する必要があります。通常のSwingAPIでは、文字列が絶対に必要なので、それを回避する方法はありません。

ただし、これを変更することはできます-JTextAreaが内部でどのように機能するかを見てください:JTextAreaは実際には機能するテキストを保存しません-テキストの保存はモデルオブジェクト(この場合はjavax.swing.Documentタイプ)に委任されます。ドキュメントを見ると、そのインターフェイスであることがわかります。通常、JTextAreaを使用すると、そのような大量のデータ(javax.swing.PlainDocument)を実際に対象としない独自のプライベートドキュメントが作成されます。これで、PlainDocumentはjavax.swing.Content(これもインターフェース)で動作し、通常はjavax.swing.StringContentで実装されます。これは、StringBuilderと直接連携する独自の新しいコンテンツクラスに置き換えることができます(そうすれば、メモリ内のデータを複製する必要がなくなります)。

したがって、StringBuilderを使用して独自のContentクラスを実装し、次のようにJTextAreaを構築できます。

Content c = new StringBuilderContent(builder);
Document d = new PlainDocument(c);
JTextArea jt = new JTextArea(d);

実際にStringBuilderContentを作成して実装することは、読者の練習問題として残されています。実際には、コンテンツを実装してファイルを直接操作することもできます。これにより、使用可能なヒープよりもはるかに大きなファイルを処理することもできます。

于 2012-11-15T11:43:02.250 に答える