2013-07-06 41 views
0

運行jar文件時使用的ProcessBuilder在運行其他罐子裏我得到了問題的一部分,問題是,我只得到流輸出的只是部分,我的代碼在這裏部分運行在運行時的ProcessBuilder,只得到BufferStreamReader

String[] command = { "java","-cp",fileJar.getAbsolutePath(), 
        "a.b.c.Class","-x",fileGram.getAbsolutePath(), 
         "-o",GIFdir.getAbsolutePath(),"/","-d","xzf","-ver"}; 
ProcessBuilder probuilder = new ProcessBuilder(command); 
pbaw = probuilder.start(); 
try { 
    String line; 
    BufferedReader input = new BufferedReader(new  
    InputStreamReader(pbaw.getInputStream())); 
    while ((line = input.readLine()) != null) { 
    System.out.println(line); 
    } 
    input.close(); 
    pbaw.waitFor(); 
} catch (InterruptedException e) { 
e.printStackTrace(); 
} 

in commad我的意思是,從jar文件內的jar文件中運行abcClass,其中包含以下選項:-x,jar應用程序中的fileGram,-o,GIFdir目錄,-d,xyz,-v。我得到完成輸出在命令控制檯,但只有部分輸出當在jar應用程序中使用進程生成器,爲什麼會發生這種情況,請幫助我!

+0

可能有一些輸出到stderr?有*兩個*輸出流 - 一個用於標準輸出和一個用於錯誤輸出 – Bohemian

+0

你的意思是有兩個輸出流,在控制檯運行的命令很好而且流暢,但在應用程序中,只有部分輸出我得到了,爲什麼? – user2458032

+0

他意味着有兩個流。請參閱ProcessBuilder Javadoc。輸出流和錯誤流。 – EJP

回答

0

這個問題很難回答,沒有更多的細節。警告:根據我的經驗,ProcessBuilderProcess可能會很難使用。始終是一個拐角的情況下潛伏...

1)你說:在控制檯運行命令細膩

確定。用這個命令在命令行中,再次運行兩次:

  • jar x y z 1> stdout.txt
  • jar x y z 2> stderr.txt

,你能否證實的stderr.txt是零個字節? 理想情況下,您應該「pastebin」這兩個文件並在此問題中提供。

2)嘗試從STDERR通過Process.getErrorStream()讀取所有字節。

3)最後,嘗試從STDOUT和STDERR讀取字節而不是字符。

... 
{ 
    ... 
    String stdout = readInputStream(process.getInputStream()); 
    String stderr = readInputStream(process.getErrorStream()); 
    ... 
} 
... 

public static String readInputStream(InputStream inputStream) { 
    StringBuilder sb = new StringBuilder(); 
    byte[] buffer = new byte[8192]; 
    Charset cs = Charset.defaultCharset(); // or something different 
    while (true) { 
     int readCount = inputStream.read(buffer); 
     if (-1 == readCount) { 
      break; 
     } 
     String x = new String(buffer, 0, readCount, cs); 
     sb.append(x); 
    } 
    String y = sb.toString(); 
    return y; 
} 
+0

是的,你們都是對的,我在getGror.getAbsolutePath()運行時犯錯,在我檢查使用getErrorStream之後,謝謝大家,你是最棒的。 – user2458032