我试图使用以下代码在.jar中启动一些.jar :(我正在尝试使用craftbukkit服务器知道)
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("java -jar craft.jar");
BufferedReader out = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedWriter in = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
this.running = true;
while(this.running){
String line;
if((line = out.readLine()) != null){
System.out.println(line);
}
}
问题是,它工作了一会儿,但过了一段时间它停止输出或只是打印'>'如下图所示。我怎样才能解决这个问题? **另外,将命令发送到bukkit服务器的正确方法是什么?
谢谢!
答案 0 :(得分:1)
在Java中使用Process
时,在两个独立的线程(你的while循环)中读取stdout和stderr是至关重要的。否则,子进程可能会锁定等待填充的缓冲区被耗尽。
使用Java 7,您实际上可以将stderr重定向到stdout,并可能将生成的流重定向到父标准输出。对于旧版本,您需要附加单独的线程。
此外:你不应该使用"单个字符串" exec的变体,但将args指定为数组。这样更安全(不太容易解析问题)。
(但我不确定这是否是您的实际问题。也许您应该转储错误流并查看它是否有帮助)
答案 1 :(得分:0)
我这样做:
@Override
public void run(){
// ...
BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream())); //of course proc is an instance of Process, and it's set up
while(true){
String line = stdInput.readLine();
if(line == null) break; //this is essential, when process terminates, line gets null
System.out.println(">"+line);
}
// ...
}
试一试。 (从技术上讲,它与你的方式类似,但它对我有用,所以我分享它)