2016-12-02 33 views
4

我發現了java.util.Scanner類的奇怪行爲。 我需要將一個字符串變量分成一組由「;」分隔的標記。當1024字符是分隔符時,Java Scanner類在標記化中失敗

如果我考慮一串「a [* 1022]」+「; [* n]」我期待n的令牌。 但是,如果n = 3,則Scanner類將失敗:它只會看到2個令牌而不是3個。我認爲這與Scanner類的內部字符緩衝區大小有關。

a[x1022];  -> 1 token: correct 

a[x1022];;  -> 2 token: correct 

a[x1022];;; -> 2 token: wrong (I expect 3 tokens) 

a[x1022];;;; -> 4 token: correct 

我附上一個簡單的例子:

import java.util.Scanner; 

public static void main(String[] args) { 

    // generate test string: (1022x "a") + (3x ";") 
    String testLine = ""; 
    for (int i = 0; i < 1022; i++) { 
     testLine = testLine + "a"; 
    } 
    testLine = testLine + ";;;"; 

    // set up the Scanner variable 
    String delimeter = ";"; 
    Scanner lineScanner = new Scanner(testLine); 
    lineScanner.useDelimiter(delimeter); 
    int p = 0; 

    // tokenization 
    while (lineScanner.hasNext()){ 
      p++; 
      String currentToken = lineScanner.next(); 
      System.out.println("token" + p + ": '" + currentToken + "'"); 
    } 
    lineScanner.close(); 
} 

我想跳過了「不正確」的行爲,你能幫幫我嗎? 謝謝

+0

可能是因爲['Scanner'使用1024的內部緩衝區大小](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/ Scanner.java/#310)。它看起來並不像你可以改變它(雖然它看起來好像在某些情況下會增長緩衝區)。 –

回答

0

我的建議是將錯誤報告給Oracle,然後通過使用BufferedReader讀取InputStream(您還需要InputStreamReader類)來解決它。 Scanner所做的並不神奇,在這種情況下直接使用BufferedReader只需要比您已經使用的更多的代碼。