一直没搞懂这两个类有自动刷新和无自动刷新的区别。PrintStream out = new PrintStream(
new FileOutputStream("D:\\333\\111.txt"), true); //这里再换成false
char[] c = new char[]{'a', 'b', 'c', 'd'};
out.print(c);以上代码运行后结果是一样111.txt都已经写入abcd了。我对刷新理解是,当输出后只有刷新了,数据才会真正写入数据的目的地。
但是上面这段代码无论是否有自动刷新它都能完成写入动作,所以我觉得很疑惑,有没有自动刷新有什么区别呢?
new FileOutputStream("D:\\333\\111.txt"), true); //这里再换成false
char[] c = new char[]{'a', 'b', 'c', 'd'};
out.print(c);以上代码运行后结果是一样111.txt都已经写入abcd了。我对刷新理解是,当输出后只有刷新了,数据才会真正写入数据的目的地。
但是上面这段代码无论是否有自动刷新它都能完成写入动作,所以我觉得很疑惑,有没有自动刷新有什么区别呢?
// BufferedInputStream in = new BufferedInputStream(
// new FileInputStream("D:\\333\\111.txt"));
// int a = 0;
// while((a = in.read()) != -1){
// System.out.print((char)a);
// }
PrintStream out2 = new PrintStream(
new FileOutputStream("D:\\333\\111.txt"), false);
char[] c = new char[]{'e', 'f', 'g', 'h'};
int i = 97;
out2.print(c);
BufferedInputStream in = new BufferedInputStream(
new FileInputStream("D:\\333\\111.txt"));
int a = 0;
while((a = in.read()) != -1){
System.out.print((char)a);
}
http://topic.csdn.net/u/20081231/09/63d95122-79b3-467a-8523-b9d3c7e61dcb.html
你也可以手动刷性public void flush();
为何你没有将参数设置为true依然会写入文件,是因为jvm会关闭你的流,执行close()同时刷新你的缓冲区。
flush
public void flush()
throws IOException刷新此输出流并强制写出所有缓冲的输出字节。flush 的常规协定是:如果此输出流的实现已经缓冲了以前写入的任何字节,则调用此方法指示应将这些字节立即写入它们预期的目标。
如果此流的预期目标是由基础操作系统提供的一个抽象(如一个文件),则刷新此流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。 OutputStream 的 flush 方法不执行任何操作。 所以你这种情况正好是例外,不执行任何操作
new BufferedOutputStream(new FileOutputStream("111.txt")), true);
char[] c = new char[]{'e', 'f', 'g', 'h'};
int i = 97;
out2.print(c);
out2.println();
BufferedInputStream in = new BufferedInputStream(
new FileInputStream("111.txt"));
int a = 0;
while((a = in.read()) != -1){
System.out.print((char)a);
} 上面的程序中就会有区别了,设定为false则没有数据
true表示在println时,会调用里面一个OutputStream的flush;false则不会调用
在上面例子中,由于是BufferedOutputStream,不调用flush则造成了数据还没有写入文件的问题了