晚上好
我需要从一个文件中读取一些行,该文件是 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/