2013-03-08 55 views
-10

掛獲得反饋後,我運行該程序,但得不到任何輸出在控制檯我沒有收到任何輸出也可能是機器的代碼

import java.io.File; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.*; 
import java.io.InputStream; 

class pbdemo { 

    static public void main(String[] args) throws Exception { 
     String s; 
     ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/f", "dir"); 
     pb.directory(new File("C:\\ljava")); 
     try { 
      Process pro = pb.start(); 
      pro.waitFor(); 
      BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream())); 

      while ((s = br.readLine()) != null) { 
       System.out.println("here we go" + s); 
      } 


     } catch (Exception e) { 
      System.out.println("sorry" + e); 
     } 
    } 
} 

程序運行,但不會有任何輸出。

+5

不要使用全部大寫爲您的標題 – Gus 2013-03-08 03:12:25

+2

你似乎有追趕()try塊內。 – codeMan 2013-03-08 03:14:14

+0

請不要放棄! – 2013-03-08 03:16:35

回答

1

pro.waitFor();是一種阻止方法。它將一直等到進程退出前退出。這樣做的問題是許多程序在標準輸出緩衝區被讀取/清除之前不會退出,這意味着在您的情況下,它可能永遠不會退出。

嘗試這樣的事情,而不是...

import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 

public class PBDemo { 

    public static void main(String[] args) throws Exception { 
     String s; 
     ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "dir"); 
     pb.directory(new File("C:\\ljava")); 
     pb.redirectError(); 
     try { 
      Process pro = pb.start(); 
      InputConsumer ic = new InputConsumer(pro.getInputStream()); 
      System.out.println("...Waiting"); 
      int exitCode = pro.waitFor(); 

      ic.join(); 

      System.out.println("Process exited with " + exitCode); 

     } catch (Exception e) { 
      System.out.println("sorry" + e); 
     } 
    } 

    public static class InputConsumer extends Thread { 

     private InputStream is; 

     public InputConsumer(InputStream is) { 
      this.is = is; 
      start(); 
     } 

     @Override 
     public void run() { 
//   This is acutally a bad idea, not all process will write a new line ;) 
//   BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream())); 

      try { 
       int in = -1; 
       while ((in = is.read()) != -1) { 
        System.out.print((char) in); 
       } 
      } catch (IOException exp) { 
       exp.printStackTrace(); 
      } 
     } 

    } 

} 
1

CMD/F標誌用於文件完成。假設你想要/C標誌執行命令,它可能是安全的。如果沒有/C標誌,cmd.exe將以交互方式運行,查找輸入,並且程序將在waitFor上無限期地阻止。替換:

new ProcessBuilder("cmd.exe", "/f", "dir"); 

new ProcessBuilder("cmd.exe", "/c", "dir"); 
1

你在等待的過程中試圖讀取它的輸出之前完成。但是有可能它可以完成所有的輸出,直到你開始閱讀它爲止......因爲操作系統無法緩衝所有的輸出。淨結果,死鎖。

更改代碼,以便pro.waitFor()調用在讀取完所有輸出後發生。

(也有可能這些東西可能被寫入「錯誤」流。但是,除非有一些嚴重的怪異與dir命令發生的事情,這是不可能的,它會產生足夠的錯誤輸出導致死鎖。所以,您可能會忽略任何(假設的)錯誤輸出......就像您當前所做的那樣)。

相關問題