【问题标题】:string tokenizer wrong usage in javajava中的字符串标记器错误用法
【发布时间】:2023-04-11 03:10:01
【问题描述】:

我相信我没有正确使用 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);

如您所见,我正在从文件中读取一大段行(end 和 begin 是行号),并且我正在将数据传输到字符串标记器。我的分隔符是:

DELIMS = "\r\n ";

因为我想分隔它们之间有空格或位于下一行的单词。 但是,此代码有时也会分隔整个单词。能有什么解释??我的 DELIMS 字符串是不是设计错了?

另外,我将“true”作为参数传递给标记器,因为我希望分隔符也被视为标记。(我想要这个是因为我想计算我当前所在的行)

你能帮帮我吗?非常感谢。

【问题讨论】:

  • 这个动作是循环执行的吗?
  • 请停止使用 StringTokenizer:“StringTokenizer 是一个遗留类,出于兼容性原因,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人使用 String 的 split 方法或改用 java.util.regex 包。”:docs.oracle.com/javase/6/docs/api/java/util/…
  • 这个动作被多个线程使用,以复制工作者的形式
  • 有没有人可以帮助我处理我正在使用的代码和我正在尝试实现的字符串标记器?
  • @biggdman - 我们三个人已经提议使用 Scanner 代替 - 这应该可以消除您在使用 StringTokenizer 时遇到的问题(Java 自己的文档不鼓励使用它),请详细说明为什么扫描仪不适合你。如果我们能更好地了解您要查找的原因和内容,那么您应该会得到一些更好的答案。

标签: java string file stringtokenizer


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您始终可以将输入流包装在 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
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 2020-01-03
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多