【问题标题】:Can Java Runtime.exec another java program that uses stdin?Java Runtime.exec 可以使用另一个使用标准输入的 java 程序吗?
【发布时间】:2011-07-21 17:56:21
【问题描述】:

我遇到了一个问题,当使用 Java Runtime 运行另一个 java 程序时,该程序会冻结,因为另一个程序需要 stdin 。使用 Runtime exec() 执行另一个 java 程序后处理标准输入有问题。

这是我无法开始工作的示例代码。这甚至可能吗?

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

【问题讨论】:

  • 如果两者都是java,你为什么不直接在你的外部java程序中调用main函数呢?只需实例化该 java 程序对象并调用其函数即可。从另一个程序执行 java 程序听起来没有意义。
  • 我相信我明白你在说什么:我需要将 JVM 参数和类路径传递给我的 Exec 程序以支持加载这些包并执行主类?

标签: java runtime runtime.exec


【解决方案1】:

调用方法Process.getOutputStream 并将您的输入提供给返回的输出流。

api docs:

public abstract OutputStream getOutputStream()

获取子进程的输出流。输出到流是 通过管道传输到由表示的进程的标准输入流中 这个 Process 对象。

实现说明:输出流最好是 缓冲。

Returns:

连接到正常输入的输出流 子进程。

【讨论】:

  • 并确保您从 stdout 和 stderr 流中读取
  • @Jochen:确实,如果他想看到他的输出,他将需要这样做。但我会等着看他是否需要更多帮助,然后再添加任何内容。
  • 某些操作系统只有有限的缓冲区空间用于进程之间的 I/O,如果您不读取输出流,则会阻塞
猜你喜欢
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 2013-10-18
  • 2015-01-01
相关资源
最近更新 更多