gpt4 book ai didi

java - 如何在父进程中拦截子进程的输出

转载 作者:太空宇宙 更新时间:2023-11-04 08:31:10 24 4
gpt4 key购买 nike

我已经有一个使用 log4j 在控制台上写入输出的 java 程序,而现在我想使用另一个 java 程序来调用第一个程序(子进程)并拦截其输出。我用的是这个页面http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4中的方法,一些代码如下

class StreamRedirector extends Thread
{
InputStream is;

StreamRedirector(InputStream is)
{
this.is = is;
}

public void run()
{
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line=null;
while ( (line = br.readLine()) != null)
{
System.out.println(line);
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
.............
try
{
Process p = Runtime.getRuntime().exec("run.bat");

StreamRedirector errSR = new StreamRedirector(p.getErrorStream());

StreamRedirector outSR = new StreamRedirector(p.getInputStream());

errSR.run();
outSR.run();

int exitVal = p.waitFor();
System.out.println("Exit Value: " + exitVal);
}

log4j config:
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">

<param name="Target" value="System.out" />

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%t] [%c{1}] %m%n" />
</layout>
</appender>

我可以获取输出消息,但只能在“run.bat”中使用 echo XXX 获取,而不是 log4j 生成的消息。如果我运行“run.bat”,我可以在控制台中看到两个输出。有没有办法让我也可以在父进程中获取 log4j 输出?谢谢。

最佳答案

StreamRedirector 扩展了Thread,但您调用的是run 而不是start。这意味着 run 在调用线程中被同步调用。这意味着在下面

    errSR.run();
outSR.run();

在第一行完成之前,第二行不会执行。我想如果错误流不会产生太多输出,那么它最终会完成。但这真的是您打算做的吗?相反尝试

    errSR.start();
outSR.start();

如果程序使用log4j,我强烈建议您考虑SocketAppender来获取从不同进程写入的内容。

EIDT:另一种方法是让 StreamRedirector 扩展 Runnable 而不是 Thread。然后调用代码更改为

Thread errorThread = new Thread(new StreamRedirector(p.getErrorStream()));
....
errorThread.start();

这不会阻止您调用 errorThread.run(),但如果您确实调用它,那么它将立即返回(而不是像当前那样阻塞),表明出现了问题。

关于java - 如何在父进程中拦截子进程的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7480249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com