我有一个运行此代码的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();
}
}
}
感谢您的帮助
答案 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....
答案 2 :(得分:1)
答案 3 :(得分:0)
现在你说你需要它在另一个进程中运行,这就是原始代码的问题:你有一个死锁。
您启动的进程开始运行并快速填充其输出和错误流。 JarTest需要定期阅读其内容。由于您迟早会在单个线程上执行此操作,因此该线程会发现自己正在等待一个流上的数据可用。此时,没有人从其他流中收集数据。
因此,您应该启动专用线程来从其他进程的标准流中收集数据。
答案 4 :(得分:0)
此处包含有关过程输入/输出线程的所有信息: link