Writer的flush()方法,深究


知道是把緩存中的內容讀入讀出。但是了解不是很具體。以寫為例,

package com.donghe.package1;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class Writer {

public static void main(String[] args) {
BufferedWriter fw =null;
try {
fw =  new BufferedWriter(new FileWriter("e:\\test.txt"));
fw.write("wo shi lucky girl.");
//fw.flush();
fw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

/fw.flush();這句有和無並不影響輸出結果,不太明白詞句是否必要。

11 个解决方案

#1


因為close的時候,會把你沒flush掉的一起flush掉。

舉個惡心但貼切(flush原意)的例子你的fw好比一個抽水馬桶
每個人用完都沖一下(flush),直到最后你要拆掉它的時候(close)拆他的人,會強制沖(fush)一下

#2


緩沖區中的數據保存直到緩沖區滿后才寫出,也可以使用flush方法將緩沖區中的數據強制寫出或使用close()方法關閉流,關閉流之前,緩沖輸出流將緩沖區數據一次性寫出。lz的例子中,flash()和close()都使數據強制寫出,所以兩種結果是一樣的,如果都不寫的話,會發現不能成功寫出

#3


to2樓,是這樣的!謝謝
我還有個疑問,下面這段代碼不寫flash()和close()也能正常輸出,為啥呢?
package com.donghe.package1;

import java.io.FileOutputStream;
import java.io.FileWriter;

public class FileOutPutDemo {

public static void main(String[] args) {
String path = "e:\\test.txt";
FileOutputStream fo = null;
try {
fo = new FileOutputStream(path);
for (int i=0;i<10;i++){
fo.write(65);
}
//fo.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

#4


引用 1 樓 shine333 的回復:
因為close的時候,會把你沒flush掉的一起flush掉。

舉個惡心但貼切(flush原意)的例子你的fw好比一個抽水馬桶
每個人用完都沖一下(flush),直到最后你要拆掉它的時候(close)拆他的人,會強制沖(fush)一下


難道每個人沖,沖不干凈?非得最后flush一下?

#5


flush的應用場景不是這樣的,close的時候會自動調用flush,所以沒有人會在close前顯式的再調用一次。

flush的語義是強制將緩沖里的數據寫入流里

#6


看源代碼就知道。
來個最簡單的。
File f = new File("e:\\test.txt");
OutputStream f1 = new FileOutputStream(f);
OutputStream o = new BufferedOutputStream(f1);
o.write(97);
o.write(97);
o.write(122);
//o.flush();
o.write(100);
o.close();


#7


其實是滿了 才沖一下
最后那點可能沒滿 所以要用flush

#8


引用 2 樓 fengerpiao123 的回復:
緩沖區中的數據保存直到緩沖區滿后才寫出,也可以使用flush方法將緩沖區中的數據強制寫出或使用close()方法關閉流,關閉流之前,緩沖輸出流將緩沖區數據一次性寫出。lz的例子中,flash()和close()都使數據強制寫出,所以兩種結果是一樣的,如果都不寫的話,會發現不能成功寫出


FileOutPutStream繼承outputStream,並不提供flush()方法的重寫
所以無論內容多少write都會將二進制流直接傳遞給底層操作系統的I/O,flush無效果
而Buffered系列的輸入輸出流函數單從Buffered這個單詞就可以看出他們是 使用緩沖區的
應用程序每次IO都要和設備進行通信,效率很低,因此緩沖區為了提高效率,當寫入設備時,先寫入緩沖區,等到緩沖區有足夠多的數據時,就整體寫入設備

#9


引用 3 樓 fanghui88 的回復:
to2樓,是這樣的!謝謝
我還有個疑問,下面這段代碼不寫flash()和close()也能正常輸出,為啥呢?
package com.donghe.package1;

import java.io.FileOutputStream;
import java.io.FileWriter;

public class FileOutPutDemo {

public static void main(String[] args) {
String path = "e:\\test.txt";
FileOutputStream fo = null;
try {
fo = new FileOutputStream(path);
for (int i=0;i<10;i++){
fo.write(65);
}
//fo.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
因為字節流失沒有緩沖區的

#10


close方法在關閉流之前,會強制刷新一下IO緩沖,這個在API里面也有提到。
flush方法,就是強制刷新 緩沖區的一種方式。

#11


其實是滿了 才沖一下
最后那點可能沒滿 所以要用flush

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com