读取 java 中的文件时出错
Error in reading a file in java
我一直在尝试练习 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)
如何让这个程序运行?
求助!
有时当您阅读文件时,您会 运行 进入各种字符。有的是字母,有的是数字,有的是整数。您需要检查它是字母、数字还是 整数 ,因为以下行假设您传递的是整数:
int score = n.nextInt();
可以通过检查整数来解决:
int score = 0;
if(n.hasNextInt()) { score = n.nextInt(); }
当您阅读节目时,请务必考虑 Cathial 的回答。通过使用 hasNext()
,您只检查是否有一个字符串,也称为标记。您应该检查是否有 n
字符串可用,其中 n
是循环中 .next()
函数的数量。
NoSuchElementException
由 Scanner.next()
抛出,意味着在文件中找不到更多标记。
这里的问题是你的 while()
循环只保证至少有一个标记可以从文件中读取,但是在循环的每次迭代中你正在读取五个标记。
您的代码中发生了什么,您正在尝试从扫描仪中读取,尽管那里没有任何可读取的内容。
你应该做什么 - 你需要在每次调用 n.next() 或 n.nextInt() 之前检查 n.hasNext(),或者只阅读整行(这似乎正是你想要的):
while (n.hasNextLine()) {
String line = n.nextLine();
System.out.println(line);
}
鉴于提供了正确的输入文件“samples.txt”,您的代码可以正常工作。例如,给定以下输入:
Richard Phillips Feynman 100
Paul Adrien Dirac 90
一切正常,但是如果您使用以下命令:
Richard Feynman 100
Paul Adrien Dirac 90
然后您获得 NoSuchElementException。在最后一个示例中,我删除了您的程序期望的中间名。因此,我们可以得出结论,您希望读取文件中的信息,而没有任何信息可供读取。我推荐如下内容:
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();
}
}
在此程序中,您可以有一个包含空行的示例文件,它希望每行读取 4 个标记,否则它会打印一条错误消息,通知您某行输入格式错误。
我一直在尝试练习 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)
如何让这个程序运行? 求助!
有时当您阅读文件时,您会 运行 进入各种字符。有的是字母,有的是数字,有的是整数。您需要检查它是字母、数字还是 整数 ,因为以下行假设您传递的是整数:
int score = n.nextInt();
可以通过检查整数来解决:
int score = 0;
if(n.hasNextInt()) { score = n.nextInt(); }
当您阅读节目时,请务必考虑 Cathial 的回答。通过使用 hasNext()
,您只检查是否有一个字符串,也称为标记。您应该检查是否有 n
字符串可用,其中 n
是循环中 .next()
函数的数量。
NoSuchElementException
由 Scanner.next()
抛出,意味着在文件中找不到更多标记。
这里的问题是你的 while()
循环只保证至少有一个标记可以从文件中读取,但是在循环的每次迭代中你正在读取五个标记。
您的代码中发生了什么,您正在尝试从扫描仪中读取,尽管那里没有任何可读取的内容。 你应该做什么 - 你需要在每次调用 n.next() 或 n.nextInt() 之前检查 n.hasNext(),或者只阅读整行(这似乎正是你想要的):
while (n.hasNextLine()) {
String line = n.nextLine();
System.out.println(line);
}
鉴于提供了正确的输入文件“samples.txt”,您的代码可以正常工作。例如,给定以下输入:
Richard Phillips Feynman 100
Paul Adrien Dirac 90
一切正常,但是如果您使用以下命令:
Richard Feynman 100
Paul Adrien Dirac 90
然后您获得 NoSuchElementException。在最后一个示例中,我删除了您的程序期望的中间名。因此,我们可以得出结论,您希望读取文件中的信息,而没有任何信息可供读取。我推荐如下内容:
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();
}
}
在此程序中,您可以有一个包含空行的示例文件,它希望每行读取 4 个标记,否则它会打印一条错误消息,通知您某行输入格式错误。