簡體   English   中英

BufferWriter自動刷新

[英]BufferWriter automatic flushing

我想知道我應該寫多長時間才能超過緩沖區,從而自動刷新緩沖區。

try
    {
        BufferedWriter br = new BufferedWriter(new FileWriter(file),1);

            br.write("How much should I write in order to get it flushed without using .flush() nor close());

我知道close()會自動刷新緩沖區,但我也知道一旦緩沖區已滿並且它接收到更多輸入,它會刷新它然后獲得更多輸入。所以我應該再寫多少才能克服我在構造函數中指定了1大小? 我輸了很多但沒有結果。 PS:只是了解緩沖區在幕后的工作原理。

提前致謝。

根據Writer合同。 你應該在完成Writer之后調用close(),這樣它就可以完成寫入數據並關閉它的資源(在這種情況下是文件處理程序到file )。

除此之外,緩沖區大小等實現細節不應該與您有關,因為它們可能會在將來的Java版本中更改,或者您更改了所使用的Writer實現。

此外,Buffered Writer的重點是通過將大塊數據收集到緩沖區然后立即寫入整個緩沖區來減少數據實際寫入磁盤的次數。 創建緩沖區為1的BufferedWriter會破壞此目的。

如果查看任何BufferedWriter write方法的Java源代碼,您將看到flushBuffer方法調用,而這些調用又調用out.write(...) 它沒有調用out.flush()

這意味着更容易理解的術語:

是的,它將在每個字符后刷新,但它會將它刷新到底層的Writer (在本例中為FileWriter ),而不是實際的文件(而不是flush ,它調用flushBuffer以及out.flush() ,刷新底層Writer實際文件)。 FileWriter有自己的刷新時間表(我不完全確定,但我認為緩沖區大小是StreamEncoder定義的默認值,即8192 )。

正如我們從BufferedWriter源代碼中看到的,它創建了一個char緩沖區

private char cb[];

默認大小= 8192.在寫下一個char之前,它檢查緩沖區是否已滿,如果為true,則將其刷新。

...
if (nextChar >= nChars)
    flushBuffer();
cb[nextChar++] = (char) c;
...

也就是說,如果您使用默認緩沖區大小創建了BufferWriter,則需要編寫8193個字符以使其刷新

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM