我正在做我的学术项目,在构建和测试时,我已经放了很多println()语句。
但是当我不得不提交所有打印时,不应该显示。
我可以实现类似侦听器的东西,当尝试执行System.out时会调用它并阻止它显示。 我不知道这个想法有多可行,但只是想知道它是否可能。 我知道我本可以使用日志文件或写入文件但是如果我必须禁用SOP我只能想到一个想法我怎么能这样做..
感谢
答案 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);