Я пишу программу, выполняющую следующие работы:
- Запустите команду с помощью 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);
}
}