我的java程序使用lib A。 我的java程序使用System.out.print()。 lib A 也使用 System.out.print()。 但我只希望控制台显示我的程序中 system.out.print() 的输出。不希望控制台显示来自 lib A 的日志。 怎么做? 谢谢。
最佳答案
如果性能和可维护性不是问题,您可以通过创建一个打印流来过滤现有的 System.out 流,该打印流在执行任何操作之前检查调用者。下面是一些示例代码,可以帮助您继续操作,但您必须重写每个方法来检查调用者:
public class PackagePrintStream extends PrintStream {
public PackagePrintStream(OutputStream out, boolean autoFlush, String encoding) throws UnsupportedEncodingException {
super(out, autoFlush, encoding);
}
@Override
public void println(Object x) {
/**
* You have to override all of the PrintStream methods
* not just println.
*/
if (allow()) {
super.println(x);
}
}
private boolean allow() {
String cn = inferCaller().getClassName();
return !cn.startsWith("lib.A"); //@todo use the right package name.
}
private boolean isPrintImplFrame(String cname) {
return PackagePrintStream.class.getName().equals(cname);
}
private StackTraceElement inferCaller() {
StackTraceElement stack[] = (new Throwable()).getStackTrace();
int ix = 0;
while (ix < stack.length) {
StackTraceElement frame = stack[ix];
String cname = frame.getClassName();
if (isPrintImplFrame(cname)) {
break;
}
ix++;
}
while (ix < stack.length) {
StackTraceElement frame = stack[ix];
String cname = frame.getClassName();
if (!isPrintImplFrame(cname)) {
return frame;
}
ix++;
}
return new StackTraceElement(PackagePrintStream.class.getName(), "write",
PackagePrintStream.class.getName(), -1);
}
}
然后要安装流,请执行以下操作:
System.setOut(new PackagePrintStream(System.out, true, "UTF-8"));
关于java - 如何根据包有选择地将system.out重定向到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32274271/