我正在使用此代码运行另一个jar: (我在某些部分更新gui,所以不要感到困惑。)我在这里得到一个IO异常(Stream Closed):
if((line = readr.readLine()) != null){
完整代码:
if(!data.serverStarted()){
try{
data.updateConsole("Starting server!");
String fileDir = data.dir + File.separator + "craftbukkit.jar";
Process proc = Runtime.getRuntime().exec("java -Xmx2048M -jar "+"craftbukkit.jar"+" -o true --nojline");
data.setOutputStream(proc.getOutputStream());
InputStream is = proc.getErrorStream();
}catch(IOException ex){
ex.printStackTrace();
}
BufferedReader readr = new BufferedReader(new InputStreamReader(is));
data.setServerStarted(true);
String line;
while(data.serverStarted()){
try {
if((line = readr.readLine()) != null){
data.updateConsole(line);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
readr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}else{
data.updateConsole("You have already started your server!");
}
答案 0 :(得分:1)
你有一个while
循环,每次传递关闭readr
。下次到try
块时,readr
将关闭。也许您打算将try/catch
块放在while
循环周围?
答案 1 :(得分:0)
您正在关闭从其中读取的循环内的阅读器。你需要在循环之外关闭它:
try {
String line;
while (data.serverStarted() && ((line = readr.readLine()) != null)) {
try {
data.updateConsole(line);
} catch (IOException e) {
e.printStackTrace();
}
}
} finally {
try {
readr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 2 :(得分:0)
我很惊讶这段代码甚至可以编译。
您在开头的try / catch中声明了实际的InputStream is
,但这使得它只在该块中可见。所以无论你给BufferedReader什么,下面的几行是其他东西,很可能不是你认为的那样。
此外,您的while(data.serverStarted())
不检查流是否仍处于打开状态,稍后您只使用一次if
检查(再次检查流是否已打开),这样您就可以了最多只阅读一行。
我觉得你在编写这段代码时遇到了错误的OutOfCoffeeException。 ;)