2013-06-01 44 views
4

我試圖通過Scanner對象讀取命令。爲了檢查輸入語法I,使用sc.hasNext()(對於缺少命令的情況)。它在許多情況下都能正常工作,但現在我已將JavaAPI中描述的情況描述爲「可能會阻止並等待輸入」。hasNext() - 它什麼時候阻塞,爲什麼?

什麼時候hasNext()方法阻塞,我該如何控制它?有趣的事情是,它的工作完全正常,前3塊的情況下。此外,JavaAPI將hasNext()描述爲用於檢查是否存在另一個輸入的正確方法,以便方法next()不生成Exception

這裏是我沒產生至今代碼:提前

if (sc.hasNext() && sc.next().equals("create")) { 
    if (sc.hasNextInt()) { 
     width = sc.nextInt(); 
     if (width > 0) { 
      if (sc.hasNextInt()) { 
       heigth = sc.nextInt(); 
       if (heigth > 0) { 
        if (sc.hasNext()) { //At this point the hasNext Statement blocks for //no reason till an Input is made. 
         charset = sc.next(); 
         Image = new AsciiImage(width, heigth,charset); 
        } else { 
         ret = false; 
         System.out.println("INPUT MISMATCH"); 
        } 
       } ...//and so on 

謝謝你,我無法找到關於這一主題的我自己的東西。 編輯:掃描儀被定義爲System.in,但這不應該是一個問題 - 至少它現在還沒有。

+3

如果沒有可用的輸入,你認爲'hasNext'應該返回什麼?如何知道是否會*成爲下一個標記,除非通過阻塞直到它看到流結束或下一個標記? –

+0

當且僅當此掃描程序具有API所示的另一個令牌時才爲true。有點奇怪......我應該用什麼來代替? 另外,它可以在我的程序中處理其他所有hasNext語句 - 在其他情況下:無輸入 - >假 - >中斷。 – Haini

+1

目前尚不清楚你想要做什麼。您需要了解掃描器基於流式輸入 - 如果當前沒有可用數據但流未關閉,則稍後可能會有更多數據...並且需要等待該信息才能返回任何內容有用。 –

回答

5

通過控制檯或通過TextFile進行測試存在差異。如果我從Console讀取程序期望一個流,它將等待進一步的輸入。

當通過來自Textfile的輸入(仍然使用System.in掃描程序,使用Java程序)進行測試時,hasNext()將在文件末尾返回false,因爲無法進一步輸入。

我無法真正找到關於此主題的文檔(在https://docs.oracle.com/javase/9/docs/api/java/util/Scanner.html#hasNext--)。所以如果有人找到一個適當和技術性的正確答案,我會非常棒。

0

如果您在等待用戶輸入時沒有其他操作,則可以在該呼叫之前阻止,直到下一個輸入到達爲止。

如果您希望在等待輸入時運行其他代碼,請生成一個新線程並從那裏調用hasNext和其他阻止掃描器方法。

+0

我必須檢查正確語法的命令,例如:create int int String。如果沒有輸入三個參數中的一個,則應顯示錯誤。 這似乎是測試我的程序的服務器以不同的方式輸入數據,最有可能的只是從Textfile中讀入,其中沒有更改,並且hasNext()返回false。我通過控制檯測試 - > hasNext()等待。 無論如何感謝。 – Haini

1

我不確定,但以下是我自己的經驗:
當掃描儀對象被饋入一個文件時,它不會被阻塞!
術語「進料與文件」我的意思是掃描儀被構造是這樣的:
Scanner scanner = new Scanner("myFile.txt");

但是,如果掃描儀是使用Socket對象的getInputStream()方法構建,如下所示:

input = socket.getInputStream(); 
Scanner scanner = new Scanner(input); 

掃描儀將被阻擋!

相關問題