Java 启动并获取.jar的输出(例如Minecraft Bukkit.jar)
我正在尝试使用以下代码在.jar中启动一些.jar:我正在尝试使用craftbukkit服务器Java 启动并获取.jar的输出(例如Minecraft Bukkit.jar),java,jar,bukkit,Java,Jar,Bukkit,我正在尝试使用以下代码在.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(
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服务器发送命令的正确方法是什么
谢谢 在Java中使用进程时,在while循环的两个独立线程中读取stdout和stderr是至关重要的。否则,子进程可能会在等待耗尽已填充的缓冲区时锁定
使用Java7,您实际上可以将stderr重定向到stdout,并可能将结果流重定向到父stdout。对于旧版本,您需要附加单独的线程
此外:不应使用exec的单字符串变量,而应将args指定为数组。这样更安全,不易出现解析问题
但我不确定这是否是你真正的问题。也许您应该转储错误流,看看它是否有帮助我这样做:
@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);
}
// ...
}
试试看。
从技术上讲,这和你做的很相似,但对我来说很有效,所以我分享它