java #multithreading #pipe
#java #многопоточность #канал
Вопрос:
class envir {
public void run() throws IOException {
ProcessBuilder builder = new ProcessBuilder("bash");
builder.redirectInput(ProcessBuilder.Redirect.PIPE);
builder.redirectOutput(ProcessBuilder.Redirect.PIPE);
builder.redirectErrorStream(true);
Process process = builder.start();
System.out.println(process.getInputStream());
}
}
Как мне сделать так, чтобы я мог отправлять строку в качестве входных данных для моего process builder для автоматизации cli (например env python3
), также используя потоки?
Если вам нужна дополнительная информация, пожалуйста, спросите; Я плохо формулирую эти вопросы.
Комментарии:
1. не уверен, о чем вы спрашиваете, но по другой теме «builder» — это свободный API, поэтому вы можете использовать его как «поток», не вызывая «builder» в каждой строке.
2. Получить
Writer
, напримерnew BufferedWriter(new OutputStreamWriter(process.getInputStream()))
, и записать в него.3. Но как вы это делаете?
4. builder.redirectInput(ProcessBuilder. Перенаправление. КАНАЛ) .redirectOutput(ProcessBuilder. Перенаправление. КАНАЛ) .redirectErrorStream(true);
5. @AndyTurner не могли бы вы объяснить подробнее
Ответ №1:
Названия потоков Process
сбивают с толку. На самом деле вам нужен выходной поток:
public abstract OutputStream getOutputStream()
Возвращает выходной поток, подключенный к обычному вводу подпроцесса.
Итак:
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream(), StandardCharsets.UTF_8));
Затем напишите в него:
bw.write("Your string");
bw.newLine();
Комментарии:
1. Важное заблуждение, которое исправляет этот ответ, заключается в следующем: getInputStream() создает InputStream, который вы используете для чтения стандартного вывода подпроцесса. getOutputStream выполняет запись в стандартный идентификатор процесса. Подумайте: из подпроцесса В родительский процесс и в подпроцесс ИЗ родительского процесса.
2. @kutschkem или, если вы не помните, прочитайте документ 🙂
3. похоже, команда не выполняется
4. @LaithStriegher Перевод строки важен, у вас это тоже есть?
5. Или
bw.flush()
, альтернативно / дополнительно.