监听器阻止System.out显示在屏幕上

时间:2010-05-03 20:46:01

标签: java

我正在做我的学术项目,在构建和测试时,我已经放了很多println()语句。

但是当我不得不提交所有打印时,不应该显示。

我可以实现类似侦听器的东西,当尝试执行System.out时会调用它并阻止它显示。 我不知道这个想法有多可行,但只是想知道它是否可能。 我知道我本可以使用日志文件或写入文件但是如果我必须禁用SOP我只能想到一个想法我怎么能这样做..

感谢

5 个答案:

答案 0 :(得分:9)

使用System.setOut函数(和setErr) 以下程序只打印1 :(而不是2)

public static void main(String[] args) throws FileNotFoundException {
    System.out.println("1");
    System.setOut(new PrintStream(new OutputStream() {
        @Override
        public void write(int arg0) throws IOException {
            // TODO Auto-generated method stub

        }
    }));
    System.out.println("2");
}

答案 1 :(得分:7)

正确的做法是在printlns之前使用标志,或者更好的是,使用Logger(有许多版本可用)。

但是,可以将所有System.out重新路由。搜索“redirect system.out”,你会发现很多例子。

答案 2 :(得分:1)

使用log4j。这将允许您执行以下操作:

if (log.isLoggingEnabled()) {
   log.debug("this will be printed at runtime with debugging enabled");
}

然后,您可以将应用程序配置为在提交代码后不打印调试语句(通常在.properties文件或XML文件中完成)。在使用Java运行的网站上使用记录器是一种非常常见的做法,特别是有很多关于log4j的文档。实际上,在大多数圈子中,使用System.out行提交代码进行调试被认为是不好的形式。想想阅读日志文件的人!

使用记录器对额外的方法调用有一个TINY命中性能,但这样做会使可维护性更加实用。你也可能会给你的导师留下深刻的印象:)

答案 3 :(得分:1)

硬编码写入System.out通常不是一个好主意。作为快速修复,您可以在一个类中将对System.out的所有引用更改为您自己的静态变量。这至少使您有机会更改要写入的流。 E.g。

public static void main(String[] args)
{
    static public PringStream out = System.out;

    void someMethod()
    {
       out.println("some logging message");
    }
}

您可以使用Myclass.out快速替换代码中System.out的所有用法。有了这个,您就可以根据参数或系统属性更改输出流。 E.g。

if (Boolean.getBoolean("debug"))
   out = System.out;
else
   out = new PrintStream(new OutputStream() {
    public void write(int data) throws IOException {}
   };

当然,这是所有裤子和一次性代码。

更强大,更灵活的解决方案是使用日志记录API,如slf4j

答案 4 :(得分:0)

PrintStream realOut = System.out;
try {
 out = new ByteArrayOutputStream();
 System.setOut(new PrintStream(out));
 System.out.println("bla");
} finally {
 System.setOut(realOut);
}
System.out.println(out);