为什么文本文件中的空行会导致java.util.NoSuchElementException?
如果您有一个文本文件:为什么文本文件中的空行会导致java.util.NoSuchElementException?,java,readfile,Java,Readfile,如果您有一个文本文件: AAA:123:123:AAAA BBB:456:456:BBBB 首先,当文本文件中没有空行并且您读取和检索数据时。一切都很好 将文件写入新文件并替换数据或更新时 AAA:9993:9993:AAAA BBB:456:456:BBBB -------- This is a blank line----------- 发生这种情况后,将不会弹出任何TouchElementException。如果空白行未被移除,错误将始终弹出。 try { File fileCI =
AAA:123:123:AAAA
BBB:456:456:BBBB
首先,当文本文件中没有空行并且您读取和检索数据时。一切都很好
将文件写入新文件并替换数据或更新时
AAA:9993:9993:AAAA
BBB:456:456:BBBB
-------- This is a blank line-----------
发生这种情况后,将不会弹出任何TouchElementException。如果空白行未被移除,错误将始终弹出。
try {
File fileCI = new File("CI.txt");
FileWriter fileWriter = new FileWriter(fileCI);
BufferedWriter bw = new BufferedWriter(fileWriter);
for (Customer ci : custList){
if (inputUser.equals(ci.getUserName()) && inputPass.equals(ci.getPassword())) {
ci.setCardNo(newCardNo);
ci.setCardType(newCardType);
}
String text = ci.getRealName() + ";" + ci.getUserName() + ";" + ci.getPassword() + ";" + ci.getAddress() + ";" + ci.getContact() + ";" + ci.getcardType() + ";" + ci.getcardNo() + System.getProperty("line.separator");
bw.write(text);
}
bw.close();
fileWriter.close();
}
catch (IOException e) {
e.printStackTrace();
}
如果我不添加System.getProperty(“line.separator”);将添加字符串,所有内容都将合并到一行中,而不使用新的分隔符。但是这个分隔符在文本文件的末尾添加了一个空行。我能做些什么来避免这个问题吗
我应该在我读文件的地方解决吗?或者在我将文件写入新文件的地方解决它
try {
Scanner read = new Scanner(file);
read.useDelimiter(";|\n");
String tmp = "";
while (read.hasNextLine()){
if (read.hasNext()){
custList.add(new Customer(read.next(), read.next(), read.next(), read.next(), read.next(), read.next(), read.next()));
} else {
break;
}
}
read.close();
}
catch (IOException e) {
e.printStackTrace();
}
编辑:这上面的阅读现在完美地工作了 我认为您到达了文件(EOF)的末尾,那里没有剩余的行,您仍在尝试读取该行。所以您得到的是NoTouchElementException(如果没有找到行) 试试这个:
String tmp="";
while (reader.hasNextLine()){
tmp = s.nextLine();
// then do something
}
我认为您不必在分隔符中使用\n
。因为我们使用的是scanner.hasNextLine()
。如果要使用scanner.next()
。然后
read.useDelimiter(";|\n");
上述行应为:
read.useDelimiter(";|\\n");// use escape character.
这样循环
while(s.hasNext()){
//do something.
}
我认为你们到达了文件(EOF)的末尾,那个里并没有剩余的行,你们仍然在试图读取这行。所以您得到的是NoTouchElementException(如果没有找到行) 试试这个:
String tmp="";
while (reader.hasNextLine()){
tmp = s.nextLine();
// then do something
}
我认为您不必在分隔符中使用\n
。因为我们使用的是scanner.hasNextLine()
。如果要使用scanner.next()
。然后
read.useDelimiter(";|\n");
上述行应为:
read.useDelimiter(";|\\n");// use escape character.
这样循环
while(s.hasNext()){
//do something.
}
那么,我如何让文件的读取者知道它的EOF,而不是试图检索更多的信息呢?@John看到了我上面的答案。看看我编辑的帖子。。我那样做对吗?我得到的是。。我只插入了中间部分,但没有插入第一和第三部分line@John为什么要将
temp
与read.nextLine()
进行比较temp
是空字符串,而read.nextLine()
可能有一些字符串。如果nextLine是空的,我希望它停止,所以我认为比较tmp是正确的做法。如何让文件的读取知道其EOF,而不尝试检索更多信息?@John看到我上面的答案。查看我编辑的帖子。。我那样做对吗?我得到的是。。我只插入了中间部分,但没有插入第一和第三部分line@John为什么要将temp
与read.nextLine()
进行比较temp
是空字符串,而read.nextLine()
可能有一些字符串。如果nextLine是空的,我希望它停止,因此我认为比较tmp是正确的做法