Извините за это нечетное звучание ...Как написать «ввести клавишу нажатой» в поток?
У меня есть следующая ситуация: я хочу, чтобы моя программа Java взаимодействовала с внешней консолью. Чтобы «отправить» отдельные команды на эту консоль, мне нужно смоделировать то, что будет «вводить клавишу нажатой» на обычной консоли. Чтобы уточнить, что я хочу, представьте, что у mysql не было другого API, и мне нужно было бы взаимодействовать через консоль. Хотя это не моя реальная проблема, она достаточно близка.
У меня есть следующий код:
String command = "/usr/local/mysql/bin/mysql";
Process child = Runtime.getRuntime().exec(command);
StreamGobbler gobbler = new StreamGobbler(child.getInputStream());
gobbler.start();
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(child.getOutputStream()));
out.write("help");
// here enter key needs to be pressed
out.flush();
// out.close();
Если вызов out.close()
выполняется, все в порядке. Но, конечно, таким образом я могу отправить только одну команду, чего я не хочу. Но если out.close()
опускается, другая программа никогда не выполняет команду. Я предполагаю, что он все еще ждет, когда команда «закончит», что на обычной консоли будет сделана, нажав enter. out.write(System.getProperty("line.separator"));
и out.newLine();
(одинаково) не решайте проблему, также out.write("\r\n");
и out.write((char) 26);
(EOF).
Конечно, возможно, что я делаю это совершенно неправильно (т. Е. Неправильный подход). Тогда я был бы признателен за указатель в правильном направлении ...
Любая помощь по этому высоко ценится.
Вы должны потреблять стандартные выходные данные ** и ** стандартные выходные потоки ошибок. Что вы получаете в этих потоках? –
В какой системе вы работаете? Вы используете пути Unix, но попробовали Windows EOF (Ctrl-Z = 26)? Unix EOF - это Ctrl-D (= 4), но, конечно же, это не так. –
@Mark Peters: К сожалению, я должен был добавить gobbler для потока вывода ошибок, но оба потока ничего не получают, если только 'out.close()' выполняется как указано. @Sergey Tachenov: Я работаю на Mac, и Ctrl-D тоже не работает, но спасибо, что указали это. – roesslerj