2

我有一个运行此代码的 jar 文件:

public class InputOutput {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        boolean cont = true;
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        while (cont) {
            System.out.print("Input something: ");
            String temp = in.readLine();
            if (temp.equals("end")) {
                cont = false;
                System.out.println("Terminated.");
            }
            else
                System.out.println(temp);
        }
    }
}

我想编写另一个 java 类来执行这个 jar 文件并可以获取输入并将输出发送给它。是否可以?我拥有的当前代码是这样的,但它不起作用:

public class JarTest {

    /**
     * Test input and output of jar files
     * @author Jack
     */
    public static void main(String[] args) {
        try {
            Process io = Runtime.getRuntime().exec("java -jar InputOutput.jar");
            BufferedReader in = new BufferedReader(new InputStreamReader(io.getInputStream()));
            OutputStreamWriter out = new OutputStreamWriter(io.getOutputStream());
            boolean cont = true;
            BufferedReader consolein = new BufferedReader(new InputStreamReader(System.in));
            while (cont) {
                String temp = consolein.readLine();
                out.write(temp);
                System.out.println(in.readLine());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

谢谢你的帮助

4

5 回答 5

2

您是否需要在不同的进程中运行 jar 文件?如果没有,您可以编写一个调用 InputOutput.main() 的 Java 程序。或者,如果仅在运行时知道 jar/类的名称,您可以创建一个新的类加载器,加载所述类并通过反射调用 main()。

至于输入/输出流的重定向,您可以使用 System.setOut、setIn、setErr。

于 2009-02-14T10:05:58.960 回答
1

使用 Runtime.exec 取决于平台。

如果您使用的是 Windows,请尝试预先添加:

cmd /c

java -jar .... etc. et

就像是:

...getRuntime().exec("cmd /c java -jar InputOutput.... 

另请参阅:进行系统调用并返回标准输出。

于 2009-02-14T05:05:11.850 回答
1

另请参阅从我们的 Java 程序执行 Java 程序

于 2009-02-14T08:40:28.650 回答
0

既然您说您需要它在另一个进程中运行,那么原始代码的问题是:您遇到了死锁。

您启动的进程开始运行并快速填充其输出和错误流。JarTest 需要定期读取它们的内容。由于您迟早会在单个线程上执行此操作,因此该线程会发现自己正在等待数据在一个流上可用。此时没有人从另一个流中收集数据。

因此,您应该启动专用线程以从其他进程的标准流中收集数据。

于 2009-02-14T19:00:18.050 回答
0

您需要的有关进程输入/输出线程的所有信息都包含在此处: 链接

于 2010-04-24T14:33:24.460 回答