2010-04-23 69 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