我相信我没有正确使用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,因为我希望将分隔符视为标记。(我希望这样,因为我想计算我当前所在的行)
你能帮我吗?非常感谢。答案 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
}
}
}