Вопрос по stdin, java – Перенаправить стандартный ввод и стандартный вывод в Java

4

Я пытаюсь перенаправить stdin и stdout подпроцесса в java, в конце концов я получу вывод в JTextArea или что-то еще.

Вот мой текущий код,

<code>Process cmd = Runtime.getRuntime().exec("cmd.exe");

cmd.getOutputStream().write("echo Hello World".getBytes());
cmd.getOutputStream().flush();

byte[] buffer = new byte[1024];
cmd.getInputStream().read(buffer);
String s = new String(buffer);

System.out.println(s);
</code>

Вывод выглядит так:

<code>Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\(Current Directory)>
</code>

Я ожидаю увидеть "Hello World" строка выводится. Может быть, потому, что родительский процесс не остается в живых достаточно долго?

Я также хотел бы иметь возможность отправлять и получать несколько команд.

Ваш Ответ

2   ответа
9

как попытаетесь прослушать входной поток, поэтому имеет смысл, что вы ничего не видите. Для этого вам необходимо использовать отдельные потоки для двух потоков.

т.е.

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Scanner;

public class Foo {
   public static void main(String[] args) throws IOException {
      Process cmd = Runtime.getRuntime().exec("cmd.exe");

      final InputStream inStream = cmd.getInputStream();
      new Thread(new Runnable() {
         public void run() {
            InputStreamReader reader = new InputStreamReader(inStream);
            Scanner scan = new Scanner(reader);
            while (scan.hasNextLine()) {
               System.out.println(scan.nextLine());
            }
         }
      }).start();

      OutputStream outStream = cmd.getOutputStream();
      PrintWriter pWriter = new PrintWriter(outStream);
      pWriter.println("echo Hello World");
      pWriter.flush();
      pWriter.close();
   }
}

И вы действительно не должны игнорировать поток ошибок, но вместо этого должны сожрать его, так как игнорирование его иногда приводит к сбою вашего процесса, так как может закончиться буферное пространство.

Error: User Rate Limit ExceededafterError: User Rate Limit Exceededcmd.exeError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
6

Runtime.getRuntime().exec() не рекомендуется (для всех практических целей). Лучше использоватьProcessBuilder учебный класс; в частности, егоstart() метод вернетПроцесс объект с методами доступа к потокам stdin и stdout, которые можно перенаправить туда, где они вам нужны. Взгляните на этосообщение для дальнейших деталей.

Похожие вопросы