3

ボタンが押されるたびにテキストファイルに行を追加しています。現在、ボタンが押されるたびにこれを行っています。

...
try {
        BufferedWriter bw = new BufferedWriter(new FileWriter(f, true));
        if (fileIsNew == true)
            bw.write(firstLine);
        bw.write(string);
        bw.close();
        Log.v("file", "written to file:" + f.getAbsolutePath());
    } catch (IOException e) {
        Log.v("IOException", e.toString());
    }
...

bufferedWriterの目的は出力をバッファリングすることなので、各行の後でbufferedwriterを閉じるのは本当に良い考えではないと思いますよね?

では、いつ電話する必要がありますbw.close()か?そして、ある種の新しいBufferedWriterを作成する必要がありinit()ますか?ボタンを押すたびに新しいBufferedWriterを作成するのは非効率的だと思います。

4

4 に答える 4

7

メンバーフィールドとして宣言し、ボタンを最初に押したときにフラグを設定して作成し、開いたままにすることができます。

押すたびに、電話write()してからflush()(コンテンツの損失を避けるため)。

BufferedWriter bw;
boolean isOpen = false;
// ..
try {
    if (!isOpen) {
        bw = new BufferedWriter(new FileWriter(logFile, true));
        bw.write(firstLine);
        isOpen = true;
    }
    bw.write(string);
    bw.flush();
    Log.v("file", "written to file:" + logFile.getAbsolutePath());
} catch (IOException e) {
    Log.v("IOException", e.toString());
}
于 2011-07-27T07:26:58.007 に答える
2

この記事では、優れたプログラミングスタイルでそれを見つけることができます。

簡単に言うと、次のFileWriterように、追加フラグをtrueに設定してインスタンスを作成する必要があります。

BufferedWriter bw = new BufferedWriter(new FileWriter("checkbook.dat", true));

楽しむ

于 2011-07-27T07:33:44.140 に答える
0

バッファリングされたリーダーを再度使用しない場合は、常に閉じる必要があります。これは、ここでのケースです。それ以外の場合は、GCに任せてオブジェクトを収集するタイミングを決定すると、その時点でリソースが破棄されます。

したがって、簡単な答えは次のとおりです。常に!

于 2011-07-27T07:26:35.027 に答える
0

あなたは基本的にあなた自身で質問に答えました、それの全体の目的はそれのIOバッファリングです。通常は一度開くか、initにするか、最初に必要になるたびに、すべてのデータの書き込みが完了したらフラッシュして閉じます。ただし、明示的に呼び出さない限りflush()、コンテンツは呼び出した瞬間に書き込まれるのではなくwrite()、後で出力するためにバッファリングされる可能性があることに注意してください。

于 2011-07-27T07:27:21.483 に答える