【问题标题】:Getting input and output from a jar file run from java class?从 java 类运行的 jar 文件获取输入和输出?
【发布时间】:2009-02-14 04:50:32
【问题描述】:

我有一个运行此代码的 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();
        }

    }
}

感谢您的帮助

【问题讨论】:

  • 哪个部分不工作?你用的是什么平台?
  • 我使用的是 Linux。我需要将这个 jar 放在一个单独的进程中,因为对于实际程序,我使用的是别人的 jar,而我没有源代码。该程序在给定特定输入时输出文本。这就是我创建 IntputOutput 来反映 jar 行为的原因。
  • 我在 Process io = Runtime.getRuntime().exec("java -jar InputOutput.jar"); 之后添加了 io.waitFor()我发现程序在运行 jar 文件后就终止了。为什么要这样做?

标签: java input executable-jar


【解决方案1】:

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

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

【讨论】:

  • 如何在我的代码中使用 setIn 和 setOut 重定向它以获取 jar 输入/输出?
【解决方案2】:

使用 Runtime.exec 取决于平台。

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

cmd /c

java -jar .... etc. et

类似:

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

另请参阅:Make system call and return stdout output.

【讨论】:

    【解决方案3】:
    【解决方案4】:

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

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

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

    【讨论】:

    • 你会怎么做?我不太确定我是否理解。我应该在新线程中添加什么?
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      相关资源
      最近更新 更多