我想了解java流。
代码:
System.out.println(System.out.getClass().getCanonicalName())
输出
java.io.PrintStream
据我所知,PrintStream是另一个流的包装器,用于添加格式化功能。但我无法理解PrintStream包装的流类是什么?这个控制台?以及如何检查它 - 从PrintStream API我找不到任何合适的方法。
答案 0 :(得分:4)
这是拥有API的重点。在某种程度上,实际的"流"变得依赖OS和平台。但是Java已经建立起来,所以你不必担心这些事情
答案 1 :(得分:3)
我推荐以下博文:How System.out.println() really works。
如果您查看java.lang.System的Open JDK代码,您会在第100行看到它是使用nullPrintStream()
初始化的,而initializeSystemClass()
函数是在第1095行,它会设置为包裹fdOut
。 fdOut
只是标准输出流的句柄,请参阅第85行的java.io.FileDescriptor代码。
所以没有太大的魔力。
答案 2 :(得分:0)
PrintStream
使用BufferedWriter textOut
和OutputStreamWriter charOut
。要打印一行,执行以下代码:
private void println() {
try {
synchronized (this) {
if (out == null)
throw new IOException("Stream closed");
textOut.newLine();
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush)
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
其中out是OutputStream
。
答案 3 :(得分:0)
最终所有流都是基于字符/字节的流。像Print Writer这样的东西就是包装器,这样你就可以根据自己喜欢的其他数据类型做事,而不是每次都将数据转换成字符/字节类型。
答案 4 :(得分:0)
它包装一个绑定到控制台输出的FileOutputStream。