我一直在尝试练习I / O文件编程,而且我仍处于基础阶段。使用java写入文件很简单,但读取文件开始让我头疼。这是我试图运行的一个简单程序(顺便说一句,我是根据Liang的一本书编写的程序)。
import java.util.Scanner;
import java.io.File;
public class Reading {
private static Scanner n;
public static void main(String[] args) throws Exception
{
File files = new File("samples.txt");
n = new Scanner(files);
while(n.hasNext())
{
String firstName = n.next();
String mi = n.next();
String lastName = n.next();
int score = n.nextInt();
System.out.println(
firstName + " " + mi + " " + lastName + " " + score);
}
n.close();
}
}
这是错误:
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at OOPFinals.Reading.main(Reading.java:17)
如何使此计划有效? 救命啊!
答案 0 :(得分:2)
None(Object)
抛出NoSuchElementException
,表示文件中没有其他令牌。
这里的问题是你的Scanner.next()
循环只保证至少有一个令牌可以从文件中读取,但是在循环的每次迭代中你都在读取五个令牌。
答案 1 :(得分:2)
您的代码中发生了什么,您正试图从扫描仪中读取,尽管没有什么可以阅读。 你应该做什么 - 你需要在每次调用n.next()或n.nextInt()之前检查n.hasNext(),或者只读整行(这看起来正是你想要的):
while (n.hasNextLine()) {
String line = n.nextLine();
System.out.println(line);
}
答案 2 :(得分:0)
有时,当您阅读文件时,您会遇到各种角色。有些是字母,有些是数字,有些是整数。您需要检查它是字母,数字还是整数,因为以下行假定您传递的是整数:
int score = n.nextInt();
可以通过检查整数:
来解决 int score = 0;
if(n.hasNextInt()) { score = n.nextInt(); }
当您从该计划中阅读时,请务必考虑到Cathial的答案。使用hasNext()
,您只需检查是否有一个字符串,也称为令牌。您应该检查是否有n
个字符串可用,其中n
是循环中.next()
个函数的数量。
答案 3 :(得分:0)
您的代码正在运行,因为提供了正确的输入文件“ samples.txt ”。例如,给出以下输入:
Richard Feynman 100
Paul Adrien Dirac 90
一切正常,但是如果您使用以下内容:
import java.util.Scanner;
import java.util.StringTokenizer;
import java.io.File;
public class Reading {
private static Scanner n;
public static void main(String[] args) throws Exception
{
File files = new File("samples.txt");
n = new Scanner(files);
String data;
while(n.hasNextLine() && !(data = n.nextLine()).equals(""))
{
StringTokenizer st = new StringTokenizer(data);
if(st.countTokens() >= 4) {
String firstName = (String) st.nextElement();
String mi = (String) st.nextElement();
String lastName = (String) st.nextElement();
int score = Integer.parseInt( (String) st.nextElement());
System.out.println(
firstName + " " + mi + " " + lastName + " " + score);
} else {
System.err.println("This line is malformed!");
}
}
n.close();
}
}
然后你获得 NoSuchElementException 。在上一个示例中,我删除了程序所期望的中间名。因此,我们可以得出结论,您希望在文件中读取信息,而无需读取任何信息。我推荐如下内容:
$form->handleRequest($request);
$wasSubmitted = $form->isSubmitted();
if(!$wasSubmitted){
$form->submit($form->getData(),false);
}
if ($form->isValid()) {
// ...
// next lines are to be sure that the form will always need to be submitted manualy :
if($wasSubmitted){
$em->persist($entity);
$em->flush();
return $this->render ...
}
}
return $this->render ...
在此程序中,您可以拥有一个空行的示例文件,并且它希望每行读取4个令牌,否则会打印一条错误消息,通知您行输入格式错误。
答案 4 :(得分:-3)
确保您的文件位于正确的文件夹中。如果samples.txt与主类不在同一个文件夹中,则需要指定路径。