Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2011-09-22) 在java中调用系统的命令行工具

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

我们经常需要在java程序中,调用某些系统命令,来完成一些工作。原理简单,但是要注意处理好程序的输出,否则可能会卡住。

示例代码如下:

Process process = null;
try {
     String cmd = "c:\\dbbackup.bat";
     process = Runtime.getRuntime().exec(cmd);
     StreamReader err = new StreamReader(process.getErrorStream());
     StreamReader out = new StreamReader(process.getInputStream());
     err.start();
     out.start();
     int exitCode = process.waitFor();
     String errMessage = err.getMessage();
     String outMessage = out.getMessage();
     if(exitCode==0) {
         System.out.println("操作成功!");
     } else {
         System.out.println("操作失败!返回代码为" + exitCode);
     }

} finally {
     if (process != null) {
         process.destroy();
     }
}


注意,代码中的errout用于读取程序的输出。就算是我们不需要管程序的输出,也要把它们读取出来丢掉,否则程序有可能会卡住。它们分别在后台各启动一个线程,同时读取。

其中StreamReader的代码如下: 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;

public class StreamReader extends Thread {
     private InputStream input;
     private List<String> lines = new ArrayList<String>();
     public StreamReader(InputStream input) {
         this.input = input;
         setDaemon(true);
         setName("process stream reader");
     }

     @Override
     public void run() {
         BufferedReader reader = new BufferedReader(new InputStreamReader(input));
         try {
             do {
                 String line = reader.readLine();
                 if (line != null) {
                     this.lines.add(line);
                 } else {
                     return;
                 }
             } while (true);
         } catch (IOException e) {
             return;
         }
     }

     public String getMessage() {
         return StringUtils.join(this.lines, "\r\n");
     }
}
comments powered by Disqus