如果您已经重定向标准输出,是否可以访问控制台?

时间:2014-06-03 17:26:16

标签: java redirect console redirectstandardoutput

上下文:

  • 我有一个简单的程序,有一堆System.out.println()次调用
  • 取决于命令行参数我要么发送标准输出 控制台或文件
  • 我还有一个非常基本的Debug类,当我的程序出现问题时,我会使用Debug.print()调用来打开调试信息

问题:

我绝不希望将Debug.print()电话发送到文件,它只是我的临时信息。当然,当我将标准重定向到文件时,也会在那里发送调试信息

尝试解决方案:

  1. 我尝试将java.io.Console与System.console().writer().println()一起使用,但当标准输出按照javadocs中的指定重定向时,它会返回NullPointerException
  2. 我试过的另一种方法是“保存”。重定向标准输出之前控制台在变量中。如果我在进行重定向的课程中这样做,这样可以正常工作,但在Debug课程中,我无法确定在我设置我的时候,某人还没有重定向标准输出控制台变量......
  3. 问题:

    是否有任何简单的写入java控制台的方法,无论标准是什么?

3 个答案:

答案 0 :(得分:3)

您始终可以通过创建引用FileOutputStream句柄的新out来写入JVM进程的stdout句柄。如果您希望使用与System.out相同的功能,只需将其打包到PrintWriter

PrintStream oldOut=new PrintStream(new FileOutputStream(FileDescriptor.out));
oldOut.println("I ignore whether System.out has been redirected");

这只绕过了使用System.setOut(…);在JVM中设置的内容。如果进程本身的标准输出已被重定向,例如在命令行中使用>,这无济于事。

答案 1 :(得分:2)

使用System.err,写入“标准错误”而不是“标准输出”。当工具的标准输出可能被重定向时,这是类Unix操作系统和Windows上用于向用户显示信息或错误消息的工具的正常方式。请注意,在Unix和Windows上,用户可以包含重定向选项以将标准错误重定向到文件(可能与标准输出相同或不同)。这比尝试直接写入控制台更好,这不允许用户选择。

答案 2 :(得分:0)

在将System.out更改为其他内容之前,请保存对其名称为stdout的引用,并且只要您想使用stdout写入控制台,就可以使用{{1}}。