从java类运行的jar文件获取输入和输出?
我有一个运行以下代码的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
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....