Есть два распространенных способа обнаружить бегала ли подпроцесс вы произошла ошибка:
- проверить свой код выхода,
- увидеть, если он записывает сообщения об ошибках в стандартный вывод или стандартную ошибку.
Я не знаю, устанавливает ли WinSCP код выхода в случае ошибки или записывает сообщение на стандартный вывод или стандартную ошибку, но он должен выполнять хотя бы один из них. (Возможно, это и то, и другое, что я ожидал бы от всех хорошо выполненных процессов). Вам просто нужно попробовать WinSCP и посмотреть, что произойдет.
Я бы рекомендовал использовать команду ProcessBuilder
вместо Runtime.getRuntime().exec(...)
для запуска команды. Если ничего другого, это позволяет перенаправить стандартную ошибку в стандартный вывод, чтобы вы могли читать только один поток.
Вот что ваш код выглядит после того, как я изменил его использовать ProcessBuilder
, получить код завершения процесса и прочитать вывод команды в строку:
public void putfile() {
try {
ProcessBuilder builder = new ProcessBuilder("winscp", "/script=D:\\command.txt");
builder.redirectErrorStream(true);
Process process = builder.start();
// read output from the process
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder outputBuilder = new StringBuilder();
String line;
do {
line = reader.readLine();
if (line != null) { outputBuilder.append(line).append('\n'); }
} while (line != null);
reader.close();
String output = outputBuilder.toString();
// inspect output for error messages.
int exitCode = process.waitFor();
// see if exit code is 0 (success) or != 0 (error)
}
catch(Exception e) {
System.out.println("Exception in index.jsp:"+e.getMessage());
}
}
Конечно, reader
должно быть закрыт в блоке finally
. Для ясности я не беспокоился об этом в приведенном выше коде.
Обратите внимание, что при запуске подпроцесса в Java вы всегда должны читать вывод подпроцесса, даже если его не интересует его содержимое. Если вы этого не сделаете, буфер, в который будет записываться вывод, может заполниться, что приведет к зависанию подпроцесса, если он хочет писать больше.
Это не JSch. Это runtime.exec. Это совершенно разные вещи. –
@RobinGreen: Я знаю, что.что я пытаюсь сказать, что я использую Runtime Class в коде, который использует jar-файл Jsch. Итак, есть ли способ справиться с этим? –
Я не думаю, что Jsch имеет отношение к этому вопросу вообще, за исключением того, что он может дать полезный ответ. –