>>FileOutPutStream继续OutputStream,并不供应flush()要领的重写所以不管内容若干write都会将二进制流直接传递给底层操作系统的I/O,flush无效果。而Buffered系列的输入输出流函数单从Buffered这个单词就能够看出他们是运用缓冲区的。
应用程序每次IO都要和装备举行通讯,效力很低,因而缓冲区为了进步效力,当写入装备时,先写入缓冲区,每次比及缓冲区满了时,就将数据一次性团体写入装备,避免了每个数据都和IO举行一次交互,IO交互斲丧太大。
运用flush()和不运用flush()效果对照
不运用flush()
String s = "Hello World";
try {
// create a new stream at specified file
PrintWriter pw = new PrintWriter(System.out);
// write the string in the file
pw.write(s);
// // flush the writer
// pw.flush();
} catch (Exception ex) {
ex.printStackTrace();
}
输出:
buffer没有满,输出为空。
运用buffer()
String s = "Hello World";
try {
// create a new stream at specified file
PrintWriter pw = new PrintWriter(System.out);
// write the string in the file
pw.write(s);
// flush the writer
pw.flush();
} catch (Exception ex) {
ex.printStackTrace();
}
获得希冀的输出效果。
剖析
close()和flush()作用有交集!
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();这句有和无并不影响输出效果,不太邃晓文句是不是必要?
由于close的时刻,会把你没flush掉的一同flush掉。
缓冲区中的数据保留直到缓冲区满后才写出,也能够运用flush要领将缓冲区中的数据强迫写出或运用close()要领封闭流,封闭流之前,缓冲输出流将缓冲区数据一次性写出。在这个例子中,flash()和close()都使数据强迫写出,所以两种效果是一样的,假如都不写的话,会发明不能胜利写出
Java默许缓冲区大小是若干?
默许缓冲去大小8192字节。
试验
char[] array = new char[8192];
Arrays.fill(array,'s');
PrintWriter pw = new PrintWriter(System.out);
pw.write(array);
output:
char[] array = new char[8193];
Arrays.fill(array,'s');
PrintWriter pw = new PrintWriter(System.out);
pw.write(array);
output:
ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss..一共8193个s...sssssssssssssssssssssssssssssssssssssssssssssss
当设置数组长度为8192时没有输出,设置8193时有输出。