java - bufferedreader 不会移动到下一行

标签 java bufferedreader stringtokenizer

晚上好

我需要从一个文件中读取一些行,该文件是 csv 文件,其结构如下:

4,
Mo Farah,30,
Jessica Ennis,27,

我需要读取这些值并将它们放入变量中,这就是我尝试这样做的方式:

  while(nextline != null){
           StringTokenizer st = new StringTokenizer(nextline,",");
           int size = Integer.parseInt(st.nextToken());
           System.out.println(size);

           nextline = reader.readLine();

           StringTokenizer st2 = new StringTokenizer(nextline, ","); //why???


           String name = st2.nextToken();
           System.out.println(name);
           int age = Integer.parseInt(st2.nextToken());

           System.out.println(age);

第一个 int (4) 读取得很好,但是如果我想移动到下一行,它会抛出一个 noSuchElementException,所以我不得不在“//为什么???”旁边写下这行为了移动到下一行,每次我想移动到下一行时,我真的必须实例化一个新的分词器吗?或者有更好的方法吗?

非常感谢

最佳答案

让我们看看发生了什么

nextline = reader.readLine(); // I'm assuming you have this here
while(nextline != null){

以下将解析 "4," 行并将其拆分为由 分隔的标记, 它将包含 1 个标记:"4":

       StringTokenizer st = new StringTokenizer(nextline,",");

以下操作会成功,但您确实应该在执行此操作之前检查 st.hasMoreTokens() 是否返回 true。它将使用 st 中的 token "4",现在不再包含 token :

       int size = Integer.parseInt(st.nextToken());
       System.out.println(size);

       // We read the next line into "nextline", this is okay but not pretty.
       // Also you need to check that nextline is not `null` here.
       nextline = reader.readLine();

       StringTokenizer st2 = new StringTokenizer(nextline, ","); //why???

为什么?

因为 st 是用来解析行 "4," 的。在行被解析后分配 nextline 不会更新 st 的内部状态(这是不可能实现的)。那样根本行不通。所以如果你在这里调用st.nextToken(),你会得到你所说的NoSuchElementException。因为您已经从 st 读取了 "4" 并且没有剩余的标记。

如果您想使用 StringTokenizer,下面是正确的做法,它将导致行 "Mo Farah,30," 被解析为标记: “Mo Farah”“30”:

       st = new StringTokenizer(nextline, ","); // Just parse the new line.
       // You can reuse the old st variable as it is now depleted.

下面的代码现在将返回下一行的第一个标记,即 "Mo Farah"。不过,您确实应该首先检查 st.hasMoreTokens() 并给出合理的错误消息:

       String name = st.nextToken(); // Change from st2 to st
       System.out.println(name);
       int age = Integer.parseInt(st.nextToken()); // Ditto

       System.out.println(age);

所以简短的回答是,是的,如果你想使用 StringTokenizer,你必须为每一行创建一个新的 StringTokenizer。如果您不关心上面的行结尾,您可以只读取所有行并将它们连接起来,然后再将它们全部传递给 StringTokenizer

但最简单的方法就是使用 String tokens[] = newline.split(",");正如马克在他的回答中所做的那样。

关于java - bufferedreader 不会移动到下一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20167063/

相关文章:

java - 使用分词器提取句子

java - 缓冲阅读器只读取文本文件中的第一行?

java - BufferedReader 从未关闭,但文件能够删除

java - 从套接字读取

java - StreamTokenizer 不将 + 视为单词

Java StringTokenizer 错误

java - 更新到 Android Studio Chipmunk 后单元测试未运行

Java 拆分正则表达式

java - Spring 和 Hibernate 的延迟加载

java - 将多参数 matches() 从 EasyMock 1 ArgumentsMatcher 转换为 EasyMock 2/3 IArgumentMatcher