2014-02-14 52 views
-1

我正在編寫一個非常簡單的「here」shell文檔,它提供了一個java類。下面是Java代碼「here」調用java類的shell腳本

public class input { 
    public static void main(String[] args) 
    { 
     try { 
     do { 
     InputStreamReader isr = new InputStreamReader(System.in); 
     BufferedReader br = new BufferedReader(isr); 
       System.out.print("cmd>"); 
       String s = br.readLine(); 
       if (s != null) { 
        System.out.println("cmd=" + s); 
        if (s.equals("quit")) return; 
       } 
     } while (true); 
     } 
     catch(Exception e) { 
     } 
    } 
} 

它只是讀取輸入和呼應回來:)

在文件「readinput」我必須調用上述

java input 

的Java類線

這裏是shell腳本來調用具有參數的上述「readinput」一個接一個地

#!/bin/sh 
./readinput << EOF1 
aaaaaaaaaa 
bbbbbbbb 
quit 
EOF1 

當我運行這個shell腳本時,第一行「aaaaaaaaa」被正確回顯,然後腳本進入無限循環。看起來像java類一直讀取空字符串。

什麼可能導致此行爲?

+2

你可能想要設置你在閱讀循環之外閱讀。 – 2014-02-14 06:31:21

+1

換句話說,'new'東西應該放在'do'之前。 – tripleee

+0

是的,我已經測試過這種變化,它工作正常,但忽略了一段時間的代碼效率,是什麼導致了Java中的這種特殊行爲? – user3309054

回答

0

您的Java類正在循環內爲每一行輸入創建InputStreamReader。當您每次創建新的InputStreamReader時,它只是第一次讀取輸入行,然後繼續讀取null。

將它們移動到do loop之前即可解決此問題。

try { 
    InputStreamReader isr = new InputStreamReader(System.in); 
    BufferedReader br = new BufferedReader(isr); 
    do { 
      System.out.println("<cmd>"); 
      String s = br.readLine(); 
      if (s != null) { 
       System.out.println("cmd=" + s); 
       if (s.equals("quit")) return; 
      } 
    } while (true); 
    isr.close(); 
    } 
    catch(Exception e) { 
    System.err.println("Exception: " + e); 
    } 
+0

anubhava,我知道我介紹的不是最有效的代碼,但邏輯上它是正確的。爲什麼它會陷入無限循環?是的,在我發佈問題之前,我確認了優化後的版本可以正常工作。但是,仍然想要理解爲什麼上述代碼在從shell腳本調用時無法工作。手動調用時效果很好 – user3309054

+0

從邏輯上講,它不是正確的,你只需打開一次閱讀器。您正在循環內部打開一個閱讀器實例,而不關閉它,導致在第一次之後讀取空字符串。 – anubhava

+0

真的並驗證,我試圖關閉循環內的讀者實例,仍然沒有改變行爲。 – user3309054

1

代碼應作如下修改,所述如果循環應該被修改。

public class input { 
    public static void main(String[] args) 
    { 
     try { 
     InputStreamReader isr = new InputStreamReader(System.in); 
     BufferedReader br = new BufferedReader(isr); 
       System.out.print("cmd>"); 
       String s = null; 
       while ((s = br.readLine())!= null) { 
        System.out.println("cmd=" + s); 
        if (s.equals("quit")) return; 
       } 
     } 
     catch(Exception e) { 
     } 
    } 
} 

雖然不需要循環外,循環應該僅用於讀取shell文件的內容。
這裏的閱讀器將首先閱讀內容,雖然將遍歷內容。

+0

我已閱讀所有評論,但存在未解答的根本性問題。無論代碼如何(在每次迭代中創建的流或僅在循環外部創建的流),當我從交互式命令行調用類並鍵入字符時,行爲都是正常的 - 沒有無限循環。當從「here」shell腳本調用同一個類時,當循環中每次創建流時,java類將進入無限循環。我想知道爲什麼從shell腳本中調用時行爲有所不同? – user3309054

+0

行爲與外殼腳本相同(並且沒有無限循環),並且在循環外創建流時使用手動輸入一次。在所有情況下,我從不關閉流,因爲它使用System.in。 – user3309054

+0

適合我;對'readLine()'的習慣用法表示讚賞。 – trashgod