我们经常需要在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();
}
}
注意,代码中的err
和out
用于读取程序的输出。就算是我们不需要管程序的输出,也要把它们读取出来丢掉,否则程序有可能会卡住。它们分别在后台各启动一个线程,同时读取。
其中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");
}
}