E.S*_*.S. 6 java flush printstream
在查看PrintWriter以下构造函数的合同时:
public PrintWriter(OutputStream out, boolean autoFlush)
PrintWriter从现有的OutputStream. 这个方便的构造函数创建必要的中间体OutputStreamWriter,它将使用默认的字符编码将字符转换为字节。参数:
out- 输出流
autoFlush- Aboolean;iftrue、println、printf、 或format方法将刷新输出缓冲区另请参见:OutputStreamWriter.OutputStreamWriter(java.io.OutputStream)
请注意,该autoFlush标志仅适用于println、printf和format。现在,我知道这一点printf,并且format基本上做与除了更多选择之外完全相同的事情print,但我只是不明白为什么他们没有print在合同中包含同样的内容。他们为什么做出这个决定?
我怀疑这是因为 Java 作者对性能做出了假设:
考虑以下代码:
public static void printArray(int[] array, PrintWriter writer) {
for(int i = 0; i < array.length; i++) {
writer.print(array[i]);
if(i != array.length - 1) writer.print(',');
}
}
Run Code Online (Sandbox Code Playgroud)
flush()您几乎肯定不希望在每次调用后都调用这样的方法。这可能会对性能造成很大影响,尤其是对于大型阵列。而且,如果出于某种原因您确实想要这样做,您可以直接打电话给 flush 自己。
这个想法是printf,format, , 和println方法可能会一次打印一大块文本,因此在每个文本之后刷新是有意义的。但在仅仅 1 个或几个字符之后,它很少(如果有的话)有意义。
经过一番搜索,我找到了这个推理的引用(强调我的):
到目前为止,我们看到的大多数示例都使用无缓冲 I/O。这意味着每个读取或写入请求都由底层操作系统直接处理。这可能会大大降低程序的效率,因为每个此类请求通常都会触发磁盘访问、网络活动或其他一些相对昂贵的操作。
为了减少这种开销,Java 平台实现了缓冲 I/O 流。缓冲输入流从称为缓冲区的内存区域读取数据;仅当缓冲区为空时才会调用本机输入 API。类似地,缓冲输出流将数据写入缓冲区,并且仅当缓冲区已满时才调用本机输出 API。
<剪断>
在关键点写出缓冲区而不是等待它填满通常是有意义的。这称为刷新缓冲区。
一些缓冲输出类支持自动刷新,由可选的构造函数参数指定。启用自动刷新后,某些关键事件会导致缓冲区被刷新。例如,自动刷新对象会在每次调用或
PrintWriter时刷新缓冲区。printlnformat
| 归档时间: |
|
| 查看次数: |
2548 次 |
| 最近记录: |