2016-12-02 5 views
4

java.util.Scannerクラスの異常な動作が見つかりました。 文字列変数を ";"で区切られたトークンのセットに分割する必要があります。1024文字が区切り文字の場合、Java Scannerクラスがトークン化に失敗する

"a [* 1022]" + "; [* n]"の文字列を考えると、n個のトークンが必要です。 しかし、n = 3の場合、Scannerクラスは失敗します.3つではなく2つのトークンが「参照」されます。Scannerクラスの内部のcharバッファサイズに関係するものだと思います。

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で直接作業する場合は、既に使用しているコードよりわずかに多くのコードが必要です。

関連する問題