Запись в InputStream Java-процесса

У меня есть код, который запускает java-процесс (т.е.: выполнение скомпилированного java-кода) через

ProcessBuilder builder = new ProcessBuilder("java", "Sample", "arg1", "arg2");
builder.redirectErrorStream(true);
Process process = builder.start();

Благодаря этому я могу в основном обрабатывать выходные данные и ошибки

OutputStream stdin = process.getOutputStream(); // <- Eh?
InputStream stdout = process.getInputStream();

BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));

// reader.readLine() blah blah

Теперь, как я могу отправить ввод в stdin? То есть, если код, выполняемый процессом, имеет строку, ожидающую ввода, как в:

Scanner scan = new Scanner(System.in);
String val = scan.nextLine();
System.out.println(val);

Я пробовал это:

writer.write("I'm from the stdin!.");
writer.flush();

Хотя ничего не произошло. Консоль все еще ждала ввода.

Любые мысли?

РЕДАКТИРОВАТЬ: Ответ был дан, как принято ниже. Я редактирую, чтобы показать неисправный код (который я не смог включить в btw. Lol).

Перед частью writer.write() у меня был

String line;
line = reader.readLine();
while (line != null) {
    System.out.println(line);
    line = reader.readLine();
}

Ответы

Ответ 1

Process OuputStream (наша точка зрения) - это STDIN с точки зрения процесса

OutputStream stdin = process.getOutputStream(); // write to this

Так что у вас должно быть правильно.

Мой драйвер (примените свои собственные лучшие практики с помощью операторов try-with-resources)

public class ProcessWriter {
    public static void main(String[] args) throws Exception {
        ProcessBuilder builder = new ProcessBuilder("java", "Test");
        builder.directory(new File("C:\\Users\\sotirios.delimanolis\\Downloads"));
        Process process = builder.start();

        OutputStream stdin = process.getOutputStream(); // <- Eh?
        InputStream stdout = process.getInputStream();

        BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));

        writer.write("Sup buddy");
        writer.flush();
        writer.close();

        Scanner scanner = new Scanner(stdout);
        while (scanner.hasNextLine()) {
            System.out.println(scanner.nextLine());
        }
    }
}

Мое приложение

public class Test {

    public static void main(String[] args) throws Exception {
        Scanner console = new Scanner(System.in);
        System.out.println("heello World");
        while(console.hasNextLine()) {
            System.out.println(console.nextLine());
        }
    }
}

Запуск драйвера печатает

heello World
Sup buddy

По какой-то причине мне нужен close(). Один flush() не сделает этого.

Изменить Это также работает, если вместо close() вы предоставите \n.

Так и с

writer.write("Sup buddy");
writer.write("\n");
writer.write("this is more\n");
writer.flush();    

водитель печатает

heello World
Sup buddy
this is more

Ответ 2

Вам необходимо добавить символ конца строки ("\n").

как:

writer.write("I'm from the stdin!.\n");
writer.flush();