2011-07-27 29 views
1

每次按下按鈕時,我都會將一行添加到文本文件中。目前,我正在做這個按鈕被按下每次:何時關閉()BufferedWriter?

... 
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()? 我應該在某種init()中創建新的BufferedWriter嗎? 我認爲每次按下按鈕時都會創建一個新的BufferedWriter效率低下。

回答

6

您可以聲明它爲成員字段,首先按下按鈕創建它,方法是設置一個標誌並將其保持打開狀態。

在每臺印刷機上,撥打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()); 
} 
0

如果你不打算再次使用它,你應該總是關閉緩衝讀取器,在這裏就是這種情況。否則,您將離開GC來決定何時收集對象,並在此時處理資源。

所以簡短的答案是:永遠!

0

你基本上你自己回答了這個問題,它的全部目的,IO緩衝。通常你會打開它一次,可能在初始化或首次需要的時候,當你寫完所有的數據時,你可以刷新並關閉它。但請注意,除非您明確地呼叫flush(),否則內容可能不會在您撥打write()的確切時刻寫入,而是緩衝以供日後輸出。

+0

事情是,我怎麼知道用戶何時寫完所有數據?我不想實施「完成」按鈕,數據應該在那裏。我可以每隔10行調用一次嗎? – intagli

+0

呃,這真的取決於你在寫什麼......如果是某種文本編輯的東西,我可能會在用戶退出應用程序時刷新並關閉它... – TC1

+0

'@Override \t public void onPause(){ \t \t output.closeBufferedWriter(); \t}'會這樣嗎? – intagli

1

this article,你可以發現,在一個良好的編程風格:

簡短的回答是,你應該創建一個FileWriter實例與追加標誌設置爲true,像這樣:

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

玩得開心

+0

謝謝,真的有用的資源。 :) – intagli

+2

我編輯了你的答案,所以它引用了引用文章的主要思想。鏈接的答案不太有用,因爲鏈接可能會被破壞。 – trincot

+0

謝謝@trincot – PedroAGSantos