2013-05-08 57 views
1

我得到了一個非常奇怪和緊急的問題。我希望你能幫助我。 我正在嘗試讀取正在執行的命令的結果。代碼永遠不會到達println-Statement。如果達到輸出的結尾,它只是「掛起」 程序。沒有失敗也沒有例外。 請幫幫我。我陷入絕望。我的項目是Scala和Java的組合。因此,解決方案的語言無關緊要。我嘗試了兩種。我的項目的編碼是Cp1252。Java/Scala readline的奇怪行爲

這裏是我的代碼

var fileScript = Runtime.getRuntime().exec(PathOfScript) 
var isr:InputStreamReader = new InputStreamReader(fileScript.getInputStream()) 
var in = new BufferedReader(isr) 
var line:String = "" 
try { 
    while ({line = in.readLine(); line!= null}) { 
    println("line: "+line) 
    } 
    println("OUTSIDE !!!"); 
    in.close(); 
} 
+0

腳本過程是否實際完成?你確定它是輸出到stdout而不是stderr嗎? – 2013-05-08 16:35:37

+0

PathOfScript var包含什麼? Excatly? – gbtimmon 2013-05-08 16:41:54

+0

路徑爲「c:\\ nusmv \\ nusmv -source script.cmd」。整個輸出可以通過代碼進行訪問......只要「結束」即可。所以它認爲,一切都是標準的。 – user2363125 2013-05-08 16:43:50

回答

1

真奇怪......我的Java版本的作品就好了:

 InputStreamReader isr = new InputStreamReader(new FileInputStream("c:\\anyfile")); 
     BufferedReader in = new BufferedReader(isr); 
     String line = ""; 
     try { 
      while ((line = in.readLine()) != null) { 
      System.out.println("line: "+line); 
      } 
      System.out.println("OUTSIDE !!!"); 
      in.close(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

我認爲這個問題是在fileScript:如果它給出了一個流,沒有按關閉它,你將永遠不會在while循環中得到空值。檢查該部分。嘗試使用常規文件(就像我在我的例子中那樣)。如果有效,問題肯定在fileScript對象中。

+0

是的,這是正確的,但我不能使用它。我可以通過腳本中的選項將輸出保存到文件中並讀取文件。然後一切都很好。問題是,直到輸出寫入文件需要一段時間。我正在檢查很多腳本。是否有解決方案來檢查文件是否已經寫入,沒有線程?如果我檢查file.exists(),我得到的反饋是錯誤的。如果我等待幾毫秒,它似乎是好的。但是,如果代碼將用於較慢的系統,比我不能確定,它的工作原理。 – user2363125 2013-05-08 16:52:37

+0

你可以嘗試使用下面的命令(或者,如果你有Linux操作系統,LS): \t \t \t \t InputStreamReader的ISR =新的InputStreamReader(調用Runtime.getRuntime()EXEC( 「cmd/c目錄」)的getInputStream() ); – Igor 2013-05-08 17:24:28

+0

是的,它的工作原理。所以問題是我的腳本的輸出?我想事先感謝伊戈爾,感謝你的幫助。 – user2363125 2013-05-08 17:31:09