Может ли Java Runtime.exec другая Java-программа, использующая stdin? - PullRequest
1 голос
/ 21 июля 2011

Я столкнулся с проблемой, когда при использовании Java Runtime для запуска другой Java-программы программа зависает, потому что другой программе требуется стандартный ввод. Существует проблема с обработкой стандартного ввода после выполнения другой Java-программы с помощью Runtime exec ().

Вот пример кода, который я не могу заставить работать. Это вообще возможно?

import java.util.*;
import java.io.*;

public class ExecNoGobble
{
    public static void main(String args[])
    {
        if (args.length < 1)
        {
            System.out.println("USAGE: java ExecNoGobble <cmd>");
            System.exit(1);
        }

        try
        {            
            String[] cmd = new String[3];
                cmd[0] = "cmd.exe" ;
                cmd[1] = "/C" ;
                cmd[2] = args[0];
            Runtime rt = Runtime.getRuntime();
            System.out.println("Execing " + cmd[0] + " " + cmd[1] + " " + cmd[2]);
            Process proc = rt.exec(cmd);
            int exitVal = proc.waitFor();
            System.out.println("ExitValue: " + exitVal);        
        } catch (Throwable t)
          {
            t.printStackTrace();
          }
    }
}

И файл ReadInput.java:

import java.io.*;

public class ReadInput {

   public static void main (String[] args) {

      //  prompt the user to enter their name
      System.out.print("Enter your name: ");

      //  open up standard input
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

      String userName = null;

      //  read the username from the command-line; need to use try/catch with the
      //  readLine() method
      try {
         userName = br.readLine();
      } catch (IOException ioe) {
         System.out.println("IO error trying to read your name!");
         System.exit(1);
      }

      System.out.println("Thanks for the name, " + userName);

   }

}  // end of ReadInput class

И, наконец, пакетный файл, который его запускает:

@echo off

echo.
echo Try to run a program  (click a key to continue)
echo.
pause>nul
java ExecNoGobble "java -cp . ReadInput"
echo.
echo (click a key to end)
pause>nul

Я также разместил вопрос здесь: http://forums.oracle.com/forums/message.jspa?messageID=9747449

1 Ответ

3 голосов
/ 21 июля 2011

Вызовите метод Process.getOutputStream и подайте ваш ввод в возвращенный выходной поток.

api docs :

public abstract OutputStream getOutputStream()

Получает выходной потокподпроцессаВывод в поток передается по потоку в стандартный входной поток процесса, представленного этим объектом Process.

Примечание по реализации: Рекомендуется буферизовать выходной поток.

Returns:

выходной поток подключен к обычному входу подпроцесса.

...