从java类运行的jar文件获取输入和输出?

从java类运行的jar文件获取输入和输出?,java,input,executable-jar,Java,Input,Executable Jar,我有一个运行以下代码的jar文件: public class InputOutput { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { boolean cont = true; BufferedReader in = new BufferedReader(n

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

    }
}

感谢您的帮助

使用Runtime.exec依赖于平台

如果您使用的是windows,请尝试预编:

cmd /c

比如:

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

另请参见:

另请参见

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


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

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

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


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

此处包含有关进程输入/输出线程的所有信息:

什么部件不工作?你在用什么平台?我在用Linux。我需要将这个jar放在一个单独的进程中,因为对于实际的程序,我使用的是其他人的jar,而我没有源代码可以使用。该程序在给定特定输入时输出文本。这就是为什么我创建了IntputOutput来镜像jar行为;我发现程序在运行jar文件后就终止了。为什么要这样做?我将如何在代码中使用setIn和setOut重定向它以获取jar输入/输出?您将如何做到这一点?我不太清楚我是否理解。我应该在新线程中添加什么?
...getRuntime().exec("cmd /c java -jar InputOutput....