Java - System.out的PrintStream流是什么?

4

I want to understand java streams.

The code :

System.out.println(System.out.getClass().getCanonicalName())

输出

java.io.PrintStream

据我所知,PrintStream是另一个流的包装器,用于添加格式化功能。但我不明白被PrintStream包装的流类是什么?这是控制台吗?如何检查它-从PrintStream API中我没有找到任何合适的方法。

5个回答

4

这就是拥有API的意义。在某些层面上,实际的“流”会变得与操作系统和平台有关。但是,Java被设置为您不必担心这些事情。


1
如果他对这些事情感兴趣,仍然可以要求它。 - Chris311
如果它是如此依赖平台,那么控制台类是如何实现的? - Pavel_K
我不能接受这个答案。Java不是那种可以说“别担心”的语言。它是一种专业语言,因此在最低层面上必须清晰明了。 - Pavel_K

3
我推荐阅读以下博客文章:如何使用 System.out.println()
如果你查看 java.lang.System 的 Open JDK 代码,你会看到在第100行它被初始化为 nullPrintStream(),并且在第1095行的 initializeSystemClass() 函数中,它被设置为封装了 fdOut 的内容。而 fdOut 只是标准输出流的句柄,请参见java.io.FileDescriptor 在第85行的代码。
因此,并没有太多的魔法。

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


"out是一个OutputStream" - 是的。但我认为OP的问题是关于它真正的实现类是哪一个。 - f1sh

0
最终所有的流都是基于字符/字节的流。像Print Writer这样的东西就是对它们的包装,让你可以根据自己熟悉的其他数据类型来进行操作,而不必每次都将数据转换为字符/字节类型。

0

它包装了一个与控制台输出相关联的FileOutputStream。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接