这可能是一个非常愚蠢的问题,但是,有什么方法可以在用Java在控制台上打印某些内容并在其他地方监听它时触发一个触发器?
我对触发器或System类(或Logger)的理解很少,所以如果有更简单的方法(没有触发器),请告诉我。
我们正在尝试使用Logger记录所有测试。目前,我们一直在使用简单的“System.out.println”来记录控制台中的所有内容,因此我想知道是否可以在打印到打印机时触发触发器,然后让侦听器将该信息添加到Logger。
感谢。
答案 0 :(得分:6)
最直接的方法是
System.setOut(new PrintStream(System.out) {
public void println(String s) {
logger.log(s);
super.println(s);
}
// override some other methods?
});
答案 1 :(得分:2)
面向方面编程(AOP)可以帮助您实现此行为。
由于您正在使用Java,因此您可以使用AspectJ(最成熟的AOP语言之一)捕获对System.out.println()
的所有调用,并“注入”您通知Logger类的行为。
以下是AspectJ中的一些示例代码:
pointcut somethingIsBeingLogged(): execution(public static * System.out.println());
before() : somethingIsBeingLogged() {
// Get the context by joinPoint.getThis();
// Notify the Logger class
}
您实际上可以停止对System.out.println()
的调用,只让您的Logger类获得控制权。如果您想采用AOP路径,我可以提供更多详细信息。
答案 2 :(得分:1)
对于Louis Wasserman来说,这只是一个很好的单身包装。任何想要使用它的人都可以免费使用我的代码。使用它,您可以以相当简单的方式在任何地方获得控制台输出。
public class SystemOutListener {
private static SystemOutListener singleton;
public static SystemOutListener GetSingleton() {
if (singleton == null) {
singleton = new SystemOutListener();
singleton.ReplaceStandartSystemOutPrintStream();
}
return singleton;
}
private ArrayList<ISystemOutObserver> observersList = new ArrayList<>();
public void AttachSystemOutObserver(ISystemOutObserver observer) {
observersList.add(observer);
}
public void RemoveSystemOutObserver(ISystemOutObserver observer) {
observersList.remove(observer);
}
private void FireSystemOutPrintln(String message) {
for (int i = 0; i < observersList.size(); i++) {
java.awt.EventQueue.invokeLater(new HandleSystemOutRunner(observersList.get(i), message));
}
}
private void ReplaceStandartSystemOutPrintStream() {
System.setOut(new PrintStream(System.out) {
@Override
public void println(String s) {
super.println(s);
FireSystemOutPrintln(s);
}
});
}
public interface ISystemOutObserver {
public void HandleSystemOut(String message);
}
private class HandleSystemOutRunner implements Runnable {
private String message;
private ISystemOutObserver target;
public HandleSystemOutRunner(ISystemOutObserver target, String message) {
this.message = message;
this.target = target;
}
@Override
public void run() {
target.HandleSystemOut(message);
}
}
}
用法:
SystemOutListener.GetSingleton().AttachSystemOutObserver(/*YOUR OBSERVER*/)
Lambda(Java 8)也可以代替观察者使用!
答案 3 :(得分:0)
可能距离你需要的地方一千英里,但你可以在linux下使用像“watch”这样的东西寻找特定的文字。如果您要注销文件,可以设置“监视”以监视文件中的某些文本并相应地发出指令。