首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PrintWriter缓冲了吗?

PrintWriter缓冲了吗?
EN

Stack Overflow用户
提问于 2015-08-24 08:30:11
回答 4查看 6.8K关注 0票数 8

我知道,如果我们想要编写格式化的数据,PrintWriter是非常好的,我也知道如何使用BufferedWriter来提高IO性能。

但我尝试过这样的方法,

代码语言:javascript
运行
复制
PrintWriter pw = new PrintWriter(System.out);
pw.println("Statement 1");
pw.println("Statement 2");
//pw.flush();

我注意到,当注释刷新方法时,没有输出,但当我取消注释时,我得到了所需的输出。

--这只有在PrintWriter被缓冲的情况下才有可能。如果是这样,那么使用BufferedWriter包装PrintWriter并编写它有什么意义?

--尽管javadoc没有提到PrintWriter是缓冲的,但似乎是这样的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-08-24 08:52:12

我检查了以1.6.0_45开头的JDK版本,所有版本都有构造函数:

代码语言:javascript
运行
复制
/**
 * Creates a new PrintWriter from an existing OutputStream.  This
 * convenience constructor creates the necessary intermediate
 * OutputStreamWriter, which will convert characters into bytes using the
 * default character encoding.
 *
 * @param  out        An output stream
 * @param  autoFlush  A boolean; if true, the <tt>println</tt>,
 *                    <tt>printf</tt>, or <tt>format</tt> methods will
 *                    flush the output buffer
 *
 * @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream)
 */
public PrintWriter(OutputStream out, boolean autoFlush) {
this(new BufferedWriter(new OutputStreamWriter(out)), autoFlush);

因此,PrintWritter使用缓冲输出。如果您想使用您指出的代码,您可以创建PrintWriter,将自动刷新设置为true,这将确保使用普林顿printf格式化方法之一刷新流。因此,您的代码在给定的上下文中如下所示:

代码语言:javascript
运行
复制
PrintWriter pw = new PrintWriter(System.out, true);
pw.println("Statement 1");
pw.println("Statement 2");
票数 8
EN

Stack Overflow用户

发布于 2015-08-24 08:36:17

来自PrintWriter的Java8源代码

代码语言:javascript
运行
复制
/**
 * Creates a new PrintWriter from an existing OutputStream.  This
 * convenience constructor creates the necessary intermediate
 * OutputStreamWriter, which will convert characters into bytes using the
 * default character encoding.
 *
 * @param  out        An output stream
 * @param  autoFlush  A boolean; if true, the <tt>println</tt>,
 *                    <tt>printf</tt>, or <tt>format</tt> methods will
 *                    flush the output buffer
 *
 * @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream)
 */
public PrintWriter(OutputStream out, boolean autoFlush) {
    this(new BufferedWriter(new OutputStreamWriter(out)), autoFlush);

您可以看到,PrintWriter使用BufferedWriter,并且它有一个选项autoFlush,只有在缓冲时才有意义。

票数 8
EN

Stack Overflow用户

发布于 2015-08-24 08:42:10

PrintWriter被缓冲。不同之处在于,PrintWriter为编写println()printf()等对象的格式化字符串表示提供了方便的方法。它也有自动冲洗(所以很明显它有一个缓冲区)。

这两个类都是有效的。如果您启用了PrintWriter的自动刷新功能,那么它可能会更少(因为每次调用类似println()的东西时,它都会刷新),另一个不同之处是,PrintWriter并不真正允许您直接写入字节。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32177690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档