0

StringTokenizerを正しく使用していないと思います。これが私のコードです:

  buffer = new byte[(int) (end - begin)];
                fin.seek(begin);
                fin.read(buffer, 0, (int) (end - begin));

                StringTokenizer strk = new StringTokenizer(new String(buffer),
                                DELIMS,true);

ご覧のとおり、ファイルから行のチャンクを読み取っており(endとbeginは行番号です)、データを文字列トークナイザーに転送しています。私の区切り文字は次のとおりです。

DELIMS = "\r\n ";

間にスペースがある単語、または次の行にある単語を区切りたいからです。ただし、このコードは単語全体を区切ることもあります。説明は何でしょうか?私のDELIMS文字列は間違って考えられていますか?

また、区切り文字もトークンとして処理したいので、引数として「true」をトークナイザーに渡します(現在の行をカウントしたいので、これが必要です)

手伝っていただけませんか。どうもありがとう。

4

2 に答える 2

2

まず、バイトを文字列に変換する方法は少し疑わしいものであり、この全体的な方法は、特に大きなファイルの場合、効率が悪くなります。

StringTokenizerを使用する必要がありますか?そうでない場合は、代わりに使用することを強くお勧めしScannerます。例を示しますが、代わりにJavadocを参照するようにお願いします。これは非常に包括的で、すでに優れた例が含まれています。とはいえ、区切り文字も受け入れますが、正規表現としても使用できるので、注意してください。

于 2011-12-10T03:25:23.473 に答える
1

入力ストリームはいつでも。でラップできますLineNumberReader。それはあなたのために行番号を追跡します。LineNumberReaderはBufferedReaderreadLine()メソッドを持つを拡張します。これで、レギュラーStringTokenizerを使用して単語をトークンとして取得できます。正規表現またはを使用することもできますScannerが、この場合、StringTokenizerは初心者にとって理解しやすく、迅速です。

RandomAccessFileが必要です。あなたはそれを指定しませんでしたが、私はあなたが使用した方法に基づいて推測しています。次のようなものを試してください:

byte [] buffer = ...; // you know how to get this.
ByteArrayInputStream stream = new ByteArrayInputStream(buffer);

// if you have java.util.Scanner
{
    int lineNumber = 0;
    Scanner s = new Scanner(stream);

    while (s.hasNextLine()) {
        lineNum++;
        String line = s.nextLine();
        System.out.format("I am on line %s%n", lineNum);
        Scanner lineScanner = new Scanner(line);

        while (lineScanner.hasNext()) {
            String word = lineScanner.next();
            // do whatever with word
        }
    }
}

// if you don't have java.util.Scanner, or want to use StringTokenizer
{
    LineNumberReader reader = new LineNumberReader(
                          new InputStreamReader(stream));
    String line = null;

    while ((line = reader.nextLine()) != null) {
        System.out.println("I am on line " + reader.getLineNumber());
        StringTokenizer tok = new StringTokenizer(line);

        while (tok.hasMoreTokens()) {
            String word = tok.nextToken();
            // do whatever with word
        }
    }
}
于 2011-12-10T03:45:30.290 に答える