Запись в 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();

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

Какие-нибудь мысли?

EDIT: На вопрос был дан ответ, принятый ниже. Я редактирую, чтобы показать неверный код (который, кстати, я не включил, лол).

До части writer.write() у меня был

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

person Gx.Zero    schedule 19.09.2013    source источник
comment
Я не уверен, но попробуйте отправить символ \n для сигнала EOL.   -  person Levente Kurusa    schedule 19.09.2013
comment
Я попробовал это с ...from the stdin!\n");. Хотя ничего не изменилось. :|   -  person Gx.Zero    schedule 19.09.2013
comment
Посмотрите таблицу ASCII и отправьте коды CRLF в отдельном флеше, извините, я на своем мобильном телефоне не могу найти это для вас.   -  person Levente Kurusa    schedule 19.09.2013
comment
Вот что я сделал writer.write("I'm from the stdin."); writer.write("\r\n"); writer.flush();   -  person Gx.Zero    schedule 20.09.2013
comment
Попробуйте сбросить перед записью CRLF.   -  person Levente Kurusa    schedule 20.09.2013


Ответы (2)


Process OutputStream (наша точка зрения) — это 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
person Sotirios Delimanolis    schedule 19.09.2013

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

как:

writer.write("I'm from the stdin!.\n");
writer.flush();
person Tamir Adler    schedule 21.08.2019
comment
На самом деле это не отвечает на вопрос, на который уже был дан ответ ~ 6 лет назад. - person mjuarez; 25.12.2019