问题描述
我在面试时被问到以下问题:
System.out.println()
除了将输出打印到控制台还有其他用途吗?
解决方法
System.out
System.out
是 PrintStream
类型的 static
对象。它持有对标准输出流的引用,通常是控制台。通常,当您想在控制台应用程序中与用户交互或显示消息、将状态和错误消息记录到控制台时,打印到控制台很有用。打印出变量的值以及检查程序是否到达特定的 if-else
分支或循环对于调试非常有用。
System.err
还有一个名为 System.err
的对象,它保存对标准错误流的引用。它通常也是控制台, System.out
也持有引用的同一个控制台。因此,您可以编写:
System.err.println("Message");
您会在控制台上收到一条消息,就像您使用 System.out
一样。但通常建议使用 err
打印错误消息。
重定向
虽然 System.out
持有对控制台的引用,但 System
类为您提供了一个名为 setOut()
的方法:
public void setOut(PrintStream out)
同样,有方法 setErr(PrintStream)
甚至 setIn(InputStream)
可用于更改 out
、err
和 in
以引用不同的流,像一个文件,所以你可以做这样的事情:
PrintStream standardOut = System.out;
PrintStream fileOut = new PrintStream(new File("filename.txt");
System.setOut(fileOut);
System.out.println("Hello World!") // This will output to the file
System.setOut(standardOut); // Reset to the standard output stream
PrintStream
的其他方法
除了 println
之外,PrintStream
还定义了 printf
和 format
之类的方法,它们也允许您格式化输入,就像您在 C 等语言中所做的那样。这些方法是相同的:
int n1 = 10,n2 = 20;
int sum = n1 + n2;
System.out.printf("%d + %d = %d",n1,n2,sum);
System.out.format("%d + %d = %d",sum);
,
严格来说,语句 System.out.println("xyz")
只是将传递的字符串 (xyz
) 和行分隔符 (System.lineSeparator()
) 写入分配给 PrintStream
的 System.out
{1}}。
请注意,上面的语句中没有提到控制台。由于可以重新分配“标准”输出流 (System.out
),因此我们可以通过执行 System.out.println("xyz")
来写入控制台以外的地方。
这是一个例子:
PrintStream fileOut = new PrintStream(new FileOutputStream("output.txt"),true);
PrintStream console = System.out; // store current System.out
System.setOut(fileOut);
System.out.println("This will be written to output.txt");