我正在编写一个执行以下工作的程序:
- 使用 ProcessBuilder 运行命令(如“svn info”或“svn diff”);
- 从进程的
getInputStream()
;读取命令的输出 - 使用命令的输出,我想要:
- 解析输出并得到我想要的并在以后使用它,或者:
- 将输出直接写入指定文件。
现在我正在做的是使用BufferedReader
逐行读取命令输出并将它们保存到一个ArrayList
,然后决定我是否只是扫描这些行以找出一些东西或将这些行写入文件。
显然这是一个丑陋的实现,因为如果我想将命令的输出保存到文件中,则不需要 ArrayList。那么你会建议什么,以更好的方式做到这一点?
这是我的一些代码:
使用它来运行命令并从进程的输出中读取
private ArrayList<String> runCommand(String[] command) throws IOException {
ArrayList<String> result = new ArrayList<>();
_processBuilder.command(command);
Process process = null;
try {
process = _processBuilder.start();
try (InputStream inputStream = process.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
String line;
while ((line = bufferedReader.readLine()) != null) {
result.add(line);
}
}
}
catch (IOException ex) {
_logger.log(Level.SEVERE, "Error!", ex);
}
finally {
if (process != null) {
try {
process.waitFor();
}
catch (InterruptedException ex) {
_logger.log(Level.SEVERE, null, ex);
}
}
}
return result;
}
在一种方法中,我可能会这样做:
ArrayList<String> reuslt = runCommand(command1);
for (String line: result) {
// ...parse the line here...
}
在另一个我可能会这样做:
ArrayList<String> result = runCommand(command2);
File file = new File(...filename, etc...);
try (PrintWriter printWriter = new PrintWriter(new FileWriter(file, false))) {
for (String line: result) {
printWriter.println(line);
}
}