2010-04-23 71 views
4

任何人都可以給我一個例子,如何流傳輸與DefaultExecutor執行的外部程序的輸出?我沒有找到任何文件描述如何做到這一點。與commons-exec流輸出?

我的外部進程將運行幾個小時,所以只抓取所有輸出數據是不可行的;它必須流式傳輸。

回答

1

注意:這個解決方案是同步的,所以它不會流。您需要閱讀的是單獨的線程,或者使用execute命令的異步版本。

private InputStream getStream() { 

String dataParsingCommand = "java"; 

PipedOutputStream output = new PipedOutputStream(); 
PumpStreamHandler psh = new PumpStreamHandler(output); 

CommandLine cl = CommandLine.parse(command); 
cl.addArgument("-jar"); 
cl.addArgument(dataParserPath); 

DefaultExecutor exec = new DefaultExecutor(); 
DataInputStream is = null; 
try { 
    is = new DataInputStream(new PipedInputStream(output)); 
    exec.setStreamHandler(psh); 
    exec.execute(dataParserCommandLine); 
} catch (ExecuteException ex) { 
} catch (IOException ex) { 
} 

return is; 
} 
+1

這可能不會爲你的其他問題的答案中概述的原因http://stackoverflow.com/questions/2702834/commons-exec-hanging-when-i-call-executor-executecommandline – 2010-04-24 10:34:17

0

下面是使用Runtime.exec的一些示例代碼。它將很容易適應你的使用。 從http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4

import java.util.*; 
import java.io.*; 
class StreamGobbler extends Thread 
{ 
    InputStream is; 
    String type; 

    StreamGobbler(InputStream is, String type) 
    { 
     this.is = is; 
     this.type = type; 
    } 

    public void run() 
    { 
     try 
     { 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String line=null; 
      while ((line = br.readLine()) != null) 
       System.out.println(type + ">" + line);  
      } catch (IOException ioe) 
       { 
       ioe.printStackTrace(); 
       } 
    } 
} 


public class GoodWindowsExec 
{ 
    public static void main(String args[]) 
    { 
     if (args.length < 1) 
     { 
      System.out.println("USAGE: java GoodWindowsExec <cmd>"); 
      System.exit(1); 
     } 

     try 
     {    
      String osName = System.getProperty("os.name"); 
      String[] cmd = new String[3]; 
      if(osName.equals("Windows NT")) 
      { 
       cmd[0] = "cmd.exe" ; 
       cmd[1] = "/C" ; 
       cmd[2] = args[0]; 
      } 
      else if(osName.equals("Windows 95")) 
      { 
       cmd[0] = "command.com" ; 
       cmd[1] = "/C" ; 
       cmd[2] = args[0]; 
      } 

      Runtime rt = Runtime.getRuntime(); 
      System.out.println("Execing " + cmd[0] + " " + cmd[1] 
           + " " + cmd[2]); 
      Process proc = rt.exec(cmd); 
      // any error message? 
      StreamGobbler errorGobbler = new 
       StreamGobbler(proc.getErrorStream(), "ERROR");    

      // any output? 
      StreamGobbler outputGobbler = new 
       StreamGobbler(proc.getInputStream(), "OUTPUT"); 

      // kick them off 
      errorGobbler.start(); 
      outputGobbler.start(); 

      // any error??? 
      int exitVal = proc.waitFor(); 
      System.out.println("ExitValue: " + exitVal);   
     } catch (Throwable t) 
      { 
      t.printStackTrace(); 
      } 
    } 
} 

編輯:這並不完全回答這個問題,因爲它使用JDK類,但它的作品。

+2

這個問題是如何使用** commons-exec **來完成一個進程調用,它包含了這個答案中顯示的大部分內容。 – 2010-04-24 20:03:05