import java.io.File;
import java.io.PrintWriter;
public class PrintWriterExample {
public static void main(String[] args) throws Exception {
//Data to write on Console using PrintWriter
PrintWriter writer = new PrintWriter(System.out);
writer.write("Hello World");
System.out.write(65);
System.out.write(' ');
System.out.flush();
System.out.close();
// writer.flush();
//writer.close();
}
}
我无法理解write()方法。它的描述说它将指定的字节写入此流。这条流'是什么意思?在哪里写的?某种缓冲? 将System.out作为参数传递给PrintWriter类构造函数意味着什么? 在这段代码里,我的数据是缓冲的吗?当我使用writer.write()和System.out.write()时是否创建了一些临时内存? 此外,当我试图评论和取消注释随机和关闭方法时,我得到的结果让我感到困惑。在这个特定的实例中为什么不会" Hello World"即使我已经冲洗并关闭缓冲区,也会在屏幕上打印出来。如果你说缓冲区不同,那么当我取消注释writer.flush()和writer.close()时,我也得到相同的结果。
答案 0 :(得分:1)
System.out
是PrintStream
,又称OutputStream
,因此您正在调用PrintWriter(OutputStream out)
构造函数。
相当于使用以下参数调用PrintWriter(Writer out)
:
new BufferedWriter(new OutputStreamWriter(out))
出于性能原因注入BufferedWriter
。
我的数据缓存在哪里?
在BufferedWriter
。
为什么不打印“Hello World”
"Hello World"
文本位于该缓冲区中,由于您从未刷新writer
,因此永远不会向下游发送到System.out
打印流。
将
System.out
作为参数传递给PrintWriter
类构造函数是什么意思?
这意味着写入PrintWriter
的任何文字都会转发到System.out
。正如javadoc所说:这个便利构造函数创建了必要的中间OutputStreamWriter,它将使用默认字符编码将字符转换为字节。
当我取消注释writer.flush()和writer.close()时,我也得到相同的结果。
那是因为你已经关闭了System.out
,所以它不再接受任何输出。 PrintWriter
默默地忽略了您尝试时抛出的错误。正如javadoc所说:此类中的方法永远不会抛出I / O异常,尽管它的一些构造函数可能会。客户端可以通过调用checkError()
来查询是否发生了任何错误。
<强>解决方案强>
致电close()
会自动致电flush()
,因此您无需在flush()
之前致电close()
。
在close()
上拨打PrintWriter
会自动拨打close()
上的System.out
,因此您无需这样做。
删除System.out.flush();
,System.out.close();
和writer.flush();
,然后只调用writer.close();
。
更好的是,您通常不应该关闭System.out
,所以只需致电writer.flush();
,然后将其打开。