как отправить строковый ввод в ProcessBuilder

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() , альтернативно / дополнительно.