从jar类中获取jar文件的输入和输出?

时间:2009-02-14 04:50:32

标签: 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(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);
        }
    }
}

我想编写另一个执行此jar文件的java类,可以获取输入并向其发送输出。可能吗?我现有的代码就是这个,但它不起作用:

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();
        }

    }
}

感谢您的帮助

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

使用Runtime.exec取决于平台。

如果您正在使用Windows,请尝试预先添加:

cmd /c

java -jar .... etc. et

类似的东西:

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

另见:Make system call and return stdout output.

答案 2 :(得分:1)

答案 3 :(得分:0)

现在你说你需要它在另一个进程中运行,这就是原始代码的问题:你有一个死锁。

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

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

答案 4 :(得分:0)

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