簡體   English   中英

Eclipse如何從以javaw.exe開始的進程中捕獲標准輸出?

[英]How does Eclipse capture stdout from a process started with javaw.exe?

假設您正在Eclipse中運行一個簡單的HelloWorld程序。 System.out.println("Hello, World!");的輸出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如何捕獲並顯示該輸出? 我希望能夠做到同樣...

創建自己的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");
    }
}

要重定向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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM