我已经查看了许多关于Java中生成的进程的输入/输出的问题,但我仍然无法弄清楚我的程序有什么问题。它真的很简短,但不起作用。我正在使用Runtime对象的exec()方法来创建新进程(我知道ProcessBuilder可能更好,但这是一个简单的赋值,我真的不必担心生成进程的stderr)
我自己从IDE /命令行运行“Processor”类。 Memory.java位于同一目录中。
public class Memory
{
public static void main(String[] args)
{
System.out.println("Memory works!");
}
}
另一个程序:
import java.io.IOException;
import java.io.InputStream;
public class Processor
{
public static void main(String[] args)
{
Runtime rt = Runtime.getRuntime();
Process proc = null;
try {
proc = rt.exec("java Memory"); //execute Memory.java which is in same directory
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(2); //exit code 2 means that process creation failed.
}
//stream to get output from memory
InputStream fromProcess = proc.getInputStream();
int x;
try {
while((x = fromProcess.read()) != -1)
System.out.print((char)x);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
没有输出,程序永远不会终止。现在可能是因为扫描仪的内存中存在while循环,但是至少应该有一些输出吗?
答案 0 :(得分:3)
你在这里遇到的问题几乎可以肯定是" java Memory"命令失败。
当您运行进程时,Java会创建三个输出,即退出代码,STDOUT和STDERR。运行外部流程的好程序将检查这三个。
您只是检查STDOUT。
如果在构建proc之后更改代码,则为:
//stream to get output from memory
InputStream fromProcess = proc.getInputStream();
InputStream fromError = proc.getErrorStream();
int x;
try {
while((x = fromProcess.read()) != -1)
System.out.print((char)x);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
while((x = fromError.read()) != -1)
System.err.print((char)x);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int exit = proc.exitValue();
System.out.println("Exited with code " + exit);
你会更好地了解出了什么问题。
很难做到,管理这三个输出,并且许多系统实现了一个单独的线程来控制STDERR和STDOUT流。你怎么解决这个问题超出了这个问题的范围。
答案 1 :(得分:0)
我尝试了你编写的代码并且运行得很好......
您是尝试从命令行还是在IDE中运行它?我尝试从Eclipse中运行它并收到IO错误。它没有注册Memory.class的位置。
我退出到文件系统并导航到Memory.class和Processor.class所在的位置。从该目录中执行工作正常。