string tokenizer在java中的错误用法

时间:2011-12-10 03:22:00

标签: java string file stringtokenizer

我相信我没有正确使用String Tokenizer。这是我的代码:

  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);

正如您所看到的,我正在从文件中读取一大块行(结束,并且开头是行号),我正在将数据传输到字符串标记器。我的划界员是:

DELIMS = "\r\n ";

因为我想分隔在它们​​之间有空格的单词,或者在下一行。 但是,这段代码有时也将整个单词分开。可能是什么解释?我的DELIMS字符串是错误的吗?

此外,我将“true”作为参数传递给tokenizer,因为我希望将分隔符视为标记。(我希望这样,因为我想计算我当前所在的行)

你能帮我吗?非常感谢。

2 个答案:

答案 0 :(得分:2)

首先,将字节转换为字符串的方法有点可疑,这种整体方法效率低,特别是对于较大的文件。

您需要使用StringTokenizer吗?如果没有,我强烈建议您使用Scanner。我将为您提供一个示例,但会要求您只是引用Javadocs,它们非常全面并且已经包含了很好的示例。也就是说,它也接受分隔符 - 但作为正则表达式,所以请注意。

答案 1 :(得分:1)

您始终可以将输入流包装在LineNumberReader中。这将跟踪您的行号。 LineNumberReader扩展BufferedReader,它具有readLine()方法。有了它,您可以使用常规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
        }
    }
}