Когда я должен закрыть () BufferedWriter? - PullRequest
2 голосов
/ 27 июля 2011

Я добавляю строку в текстовый файл при каждом нажатии кнопки. В настоящее время я делаю это каждый раз, когда нажимается кнопка:

...
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());
    }
...

Я не думаю, что это действительно хорошая идея - закрывать буферизованный писатель после каждой строки, поскольку цель буферизованного писателя - буферизовать вывод, верно?

Так, когда я должен позвонить bw.close()? И должен ли я создать новый BufferedWriter в каком-то виде init()? Я думаю, что неэффективно создавать новый BufferedWriter при каждом нажатии кнопки.

Ответы [ 4 ]

7 голосов
/ 27 июля 2011

Вы можете объявить его как поле члена, создать его при первом нажатии на кнопку, установив флаг, и оставить его открытым.

При каждом нажатии звоните 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());
}
2 голосов
/ 27 июля 2011

В этой статье вы можете найти, что в хорошем стиле программирования:

Короткий ответ: вам следует создать экземпляр FileWriter с установленным флагом добавленияистинно, вот так:

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

Веселись

0 голосов
/ 27 июля 2011

Вы в основном ответили на вопрос самостоятельно, вся цель этого Буферизация ввода-вывода . Обычно вы открываете его один раз, можете быть в init или всякий раз, когда это необходимо, вы очищаете и закрываете его, когда заканчиваете записывать все данные. Однако обратите внимание, что если вы явно не вызываете flush(), содержимое может быть записано не в тот момент, когда вы вызываете write(), но буферизируется для последующего вывода.

0 голосов
/ 27 июля 2011

Вы всегда должны закрывать буферизованный ридер, если не собираетесь использовать его снова, как здесь.В противном случае вы отправляетесь в GC, чтобы решить, когда собирать объект, и ресурс будет утилизирован в это время.

Поэтому краткий ответ: ВСЕГДА!

...