Java - Stream已关闭

时间:2013-12-01 13:14:41

标签: java exception

我正在使用此代码运行另一个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!");
    }

3 个答案:

答案 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。 ;)