2012-12-23 29 views
1

考慮下面的練習問題代碼,其中的規範大致寫着:「在調用readTokens()時,等待用戶按回車鍵,然後繼續執行。」爲InputStreamReader定義此行爲的規範在哪裏?

我不完全理解爲什麼我的代碼有效,爲什麼程序在「輸入數據:」之後暫停,並等待回車?這種行爲在哪裏定義,它如何改變?

import java.io.*; 
import java.util.LinkedList; 

public class StreamTokeTwo { 

private int ttype = 0; 
StreamTokenizer tokenizer = new StreamTokenizer(new BufferedReader(
     new InputStreamReader(System.in))); 

private void setupTokenizer() { 
    tokenizer.resetSyntax(); 
    tokenizer.wordChars(33, 126); 
    tokenizer.whitespaceChars(0, 32); 
    tokenizer.whitespaceChars(44,44); 
    tokenizer.whitespaceChars(47,47); 
    tokenizer.eolIsSignificant(true); 
} 

private String[] readTokens() { 
    LinkedList<String> list = new LinkedList<String>(); 
    String[] array = null; 

    do { 
     try { 
      ttype = tokenizer.nextToken(); 
     } catch (Exception e) { 
      System.exit(1); 
     } 
     if (ttype == StreamTokenizer.TT_WORD) { 
      list.add(tokenizer.sval); 
     } 
    } while (ttype != StreamTokenizer.TT_EOL); 

    array = list.toArray(new String[0]); 
    return array; 
} 

public static void main(String[] args) { 
    StreamTokeTwo streamToke = new StreamTokeTwo(); 
    streamToke.setupTokenizer(); 

    for (int i = 0; i < 5; ++i) { 
     System.out.print("Enter data: "); 
     String[] array = streamToke.readTokens(); 
     for (String str : array) { 
      System.out.print(str + " "); 
     } 
     System.out.println(); 
    } 
} 
} 
+0

您的控制檯是行緩衝的。你在哪個平臺上? –

回答

3

等待輸入行爲是操作系統和shell的一項功能。他們將您的打字轉換爲JVM的標準輸入,並決定什麼構成文件結尾,以及什麼使數據可以傳遞給正在讀取其標準輸入的程序。

就JVM而言,它只是要求來自標準輸入的數據,如果沒有可用的數據並且它不在文件末尾,將會阻止該數據。如果標準輸入是磁盤文件,它也會這樣做。

1

這是由聲明中表示,InputStreamReader阻擋行爲暗示:閱讀方法不會返回,直到有東西被讀取,或發生錯誤。