私は次の作業を行うプログラムを書いています。
- ProcessBuilderを使用してコマンドを実行します(「svninfo」や「svndiff」など)。
- プロセスの
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;
}
そして1つの方法で私はこのようにするかもしれません:
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);
}
}