Я пытаюсь решить взаимодействие с процессом командной строки, используя Apache Commons exec.Я застрял со следующим кодом:
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayOutputStream ins = new ByteArrayOutputStream();
OutputStreamWriter ow = new OutputStreamWriter(ins);
BufferedWriter writer = new BufferedWriter(ow);
ByteArrayInputStream in = new ByteArrayInputStream(ins.toByteArray());
PumpStreamHandler psh = new PumpStreamHandler(out, null, in);
CommandLine cl = CommandLine.parse(initProcess);
DefaultExecutor exec = new DefaultExecutor();
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
exec.setStreamHandler(psh);
try {
exec.execute(cl, resultHandler);
int i = 0;
while (true) {
String o = out.toString();
if (!o.trim().isEmpty()) {
System.out.println(o);
out.reset();
}
// --- PROBLEM start ---
if (i == 3) {
writer.write(internalProcessCommand);
// string with or without trailing \n, both tested
writer.flush();
writer.close();
// tested even ins.write(internalProcessCommand.getBytes())
}
// --- PROBLEM end ---
Thread.sleep(3000);
i++;
}
} catch (ExecuteException e) {
System.err.println(e.getMessage());
}
Я надеюсь, что мой код ясен.Я постоянно читаю out
и печатаю его через 3 секунды при очистке потока.Проблема - это ввод в in
, переданный в PumpStreamHandler
.Мне нужно передавать команды процесса из самого кода, непрерывно и динамически, как если бы я взаимодействовал с процессом через CLI.Когда я просто использую System.in
в качестве аргумента PumpStreamHandler
, я могу нормально писать команды процесса из консоли.Как мне получить такой же результат, передавая строки из кода?
Редактировать: Я также пытался подключить PipedInputStream
, получая данные от PipedOutputStream
, но кажется, что данные можно прочитатьтолько после закрытия PipedOutputStream
, что делает его многоразовым, поэтому я не могу достичь интерактивности.
Редактировать 2: Решил сам.Решение в ответе ниже.Howgh.: -)