2013-12-01 4 views
-1

Я бег другой баночки с этим кодом: (я обновляя графический интерфейс в некоторых частях, так что не чувствуют себя в замешательстве.) Я получаю исключение IO (поток Closed) здесь:Java - поток закрыт

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!"); 
    } 

ответ

1

У вас есть while цикл, который закрывает readr на каждом проходе. В следующий раз, когда он доберется до блока try, readr закрыт. Возможно, вы намеревались разместить блок try/catch вокруг цикла while?

+0

Я с удовольствием добавлю исправления в любые актуальные проблемы, если нисходящий будет писать комментарии. – chrylis

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(); 
    } 
} 
0

Я удивлен, что этот код даже компилируется.

Вы указываете фактический InputStream is внутри try/catch в начале, но это делает его видимым только внутри этого блока. Итак, что бы вы ни передали BufferedReader, несколько строк ниже - это что-то еще и, скорее всего, не то, что вы думаете.

Кроме того, ваш while(data.serverStarted()) не проверяет, открыт ли поток, а позже вы используете только одну проверку if (опять же, не проверяя, открыт ли поток), поэтому вы будете читать только одну строчку в лучшем случае ,

У меня возникло ощущение, что при написании этого кода у вас было плохое OutOfCoffeeException. ;)

Смежные вопросы