System.out.println() 除了将输出打印到控制台还有其他用途吗? System.outSystem.err重定向PrintStream的其他方法

问题描述

我在面试时被问到以下问题:

System.out.println() 除了将输出打印到控制台还有其他用途吗?

解决方法

System.out

System.outPrintStream 类型的 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) 可用于更改 outerrin 以引用不同的流,像一个文件,所以你可以做这样的事情:

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 还定义了 printfformat 之类的方法,它们也允许您格式化输入,就像您在 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()) 写入分配给 PrintStreamSystem.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");