关于PrintStream/PrintWriter中自动刷新的问题。

llm0528 2009-01-04 03:41:10
一直没搞懂这两个类有自动刷新和无自动刷新的区别。

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了。我对刷新理解是,当输出后只有刷新了,数据才会真正写入数据的目的地。
但是上面这段代码无论是否有自动刷新它都能完成写入动作,所以我觉得很疑惑,有没有自动刷新有什么区别呢?
...全文
634 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
llm0528 2009-01-04
  • 打赏
  • 举报
回复
7楼是对的,前面我自己也想到了,只有加了BufferedOutputStream才能谈刷不刷新的问题。
ChDw 2009-01-04
  • 打赏
  • 举报
回复
因为在PrintStream在调用print时,还是直接调用了底层的OutputStream的print的,


true表示在println时,会调用里面一个OutputStream的flush;false则不会调用


在上面例子中,由于是BufferedOutputStream,不调用flush则造成了数据还没有写入文件的问题了
ChDw 2009-01-04
  • 打赏
  • 举报
回复
	        PrintStream out2 = new PrintStream(
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则没有数据
yjxqgd 2009-01-04
  • 打赏
  • 举报
回复
这个问题JDK5.0帮助文档里这么写到
flush
public void flush()
throws IOException刷新此输出流并强制写出所有缓冲的输出字节。flush 的常规协定是:如果此输出流的实现已经缓冲了以前写入的任何字节,则调用此方法指示应将这些字节立即写入它们预期的目标。
如果此流的预期目标是由基础操作系统提供的一个抽象(如一个文件),则刷新此流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。

OutputStream 的 flush 方法不执行任何操作。



所以你这种情况正好是例外,不执行任何操作


ZiSheng 2009-01-04
  • 打赏
  • 举报
回复
一些关闭操作,也会刷新你的缓冲区,close();
为何你没有将参数设置为true依然会写入文件,是因为jvm会关闭你的流,执行close()同时刷新你的缓冲区。
ZiSheng 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 llm0528 的帖子:]
一直没搞懂这两个类有自动刷新和无自动刷新的区别。

PrintStream out = new PrintStream(

Java code new FileOutputStream("D:\\333\\111.txt"), true); //这里再换成false
char[] c = new char[]{'a', 'b', 'c', 'd'};
out.print(c);



以上代码运行后结果是一样111.txt都已经写入abcd了。我对刷新理解是,当输出后只有刷新了,数据才会真正写入数据的目的地。
但是上面这段代…
[/Quote]
你的理解是不正确的,构造函数的第二个参数为真,表示则每当写入 byte 数组、调用其中一个 println 方法或写入换行符或字节 ('\n') 时都会刷新输出缓冲区。而为假的时候会在缓冲区满的时候再写入。
你也可以手动刷性public void flush();

llm0528 2009-01-04
  • 打赏
  • 举报
回复
我试过了,还是没区别。无论是先读后写、还是先写后读,结果都一样,并没有出现FileOutputStream不close()或flash()则无法读取,或数据无法修改的情况
//		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);
}
hbgzg3006 2009-01-04
  • 打赏
  • 举报
回复
你从本地读取一个文件,然后再写回这个文件就知道了。
内容概要:本文深入讲解了Java IO流的核心进阶知识,涵盖转换流、打印流、数据流以及对象序列化与反序列化的原理与实战应用。重点介绍了InputStreamReader和OutputStreamWriter如何在字节流与字符流之间进行编码转换,解决不同编码格式文件的读写乱码问题;详细说明了PrintStreamPrintWriter在输出各种数据类型时的便利性及其自动刷新机制;阐述了DataInputStream和DataOutputStream如何实现基本数据类型的读写,并通过学生成绩存储案例展示了其实际应用;最后系统讲解了对象序列化与反序列化的概念、实现方式(实现Serializable接口、使用transient关键字控制字段序列化)及ObjectInputStream/ObjectOutputStream的使用,结合Book对象持久化案例完整呈现了对象存储与恢复的流程。 适合人群:具备Java基础,熟悉基本IO操作,有一定项目经验的开发人员(工作1-3年),希望深入理解Java IO核心机制并提升实战能力的学习者。 使用场景及目标:①解决跨编码文件读写时的乱码问题;②实现结构化数据(如用户、成绩)的持久化存储与网络传输;③掌握打印流简化多类型数据输出的操作;④理解对象序列化在分布式系统、缓存、配置保存等场景的应用原理。 阅读建议:此资源注重理论与实践结合,建议读者在学习过程动手编写并调试文所有示例代码,尤其是编码转换、数据流读写和序列化案例,以加深对IO流底层工作机制的理解,并注意异常处理和资源关闭的最佳实践。

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧