Eclipse如何从javaw.exe启动的进程中捕获stdout?

时间:2017-10-13 17:37:01

标签: java eclipse javaw

让我们假设你在Eclipse中运行一个简单的HelloWorld程序。 System.out.println("Hello, World!");的输出在'控制台'中清晰可见。标签。但是,如果您再打开“调试”按钮。透视并显示'过程属性'窗口,你会看到这样的东西:

Path:
C:\Program Files\Java\jdk1.8.0_144\bin\javaw.exe

Working Directory:
C:\eclipse-workspace\HelloWorld

Command Line:
"C:\Program Files\Java\jdk1.8.0_144\bin\javaw.exe" 
-Dfile.encoding=Cp1250 
-classpath "<blah-blah>" 
HelloWorld

因此,看起来它使用javaw.exe来启动JVM。但是如果你从命令行运行完全相同的命令,你就不会看到任何输出(就像你期望的那样,因为javaw应该与stdout和stderr分离)。

那么,Eclipse如何捕获并显示该输出?我希望能够做同样的事情......

2 个答案:

答案 0 :(得分:0)

创建自己的PrintStream并使用System.setOut(PrintStream out)方法。

public class RedirectSystemOut {
     public static void main(String[] args) throws FileNotFoundException {
         System.out.println("This goes to the console");
         PrintStream console = System.out;

         File file = new File("out.txt");
         FileOutputStream fos = new FileOutputStream(file);
         PrintStream ps = new PrintStream(fos);
         System.setOut(ps);
         System.out.println("This goes to out.txt");

         System.setOut(console);
         System.out.println("This also goes to the console");
    }
}

答案 1 :(得分:0)

要在Java中重定向外部进程的输出流,可以使用ProcessBuilder类。

使用示例

public class Main {
    public static void main(String[] args) throws Exception {
        ProcessBuilder pb = new ProcessBuilder("javaw", "-version")
                .inheritIO();
        Process p = pb.start();
        int returnValue = p.waitFor();
        System.out.println(returnValue);
    }
}

示例输出

java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
0