如何读取文本文件的内容并检查它们在 Java 中是否有效
How can I read the contents of a text file and check if they're valid or invalid in Java
我在 Java 编程和编程方面相当陌生。目前我正在学习异常以及如何处理它们。在这个实验中,我得到了多个文本文件,其中包含以类似网格的方式显示的数字。我被告知使用命令行参数一次性 运行 所有文件。
The way the text files look (screenshot)
所有文件命名有效或无效。无效文件中有一些我必须检查的独特错误。每个文本文件的第一行给出总行数和列数。我一直想弄清楚如何检查文本文件的有效性:invalid2、invalid5 和 invalid7。我可以编写一些错误的代码来捕获文件 invalid5 和 invalid7 中的错误(我不想这样做),但是 invalid2 确实让我很为难。 invalid2 的问题是文件中的第一行告诉我网格有 3 行 和 4 列,但实际网格有 4 行 和 3 列 。
invalid2 text file screenshot
我目前正在尝试将网格分成 个人 行。我的逻辑(这里是我想知道它是否有问题的地方)是我正在使用一个 while 循环来检查文本文件中是否有下一行。如果有,我将增加我的行计数器(即使我已经知道网格有多少行)。然后我检查行计数器是否大于给定的实际行数,这会引发行太多的异常。如果没有,我将继续解析网格的每一行。我使用一个字符串“nextLine”,它包含网格那一行中的所有数字,并使用扫描仪“解析”解析该字符串。我使用一个 for 循环,它的运行次数与列数相同(文件给出的 #)。然后我设置 double 类型的变量“num”以获取该字符串中的下一个 double。此时我的程序崩溃了。我不知道为什么我在代码的那一行收到 NoSuchElementException。 Screenshot on Eclipse 我真的不需要对从文件中读取的信息做任何事情,所以“num”变量就在那里移动到行中的下一个数字。
我有两个问题
- 为什么我的那部分代码出现 NoSuchElementException?
- 我尝试检查每个文本文件有效性的逻辑是否正确?
控制台的输出应该如下所示:
valid1.dat
有效
在valid1.dat
java.lang.NumberFormatException:对于输入字符串:“X”
无效
等...
这是我的代码:
public class FormatChecker {
public static void main(String[] args) {
for(int n = 3; n < args.length; n++) { // Loops through command-line arguments
String fileName = args[n]; // Sets specific file
try {
File file = new File(fileName); // new File from specified file name
Scanner read = new Scanner(file); // Scanner object to read the new file
String firstLine = read.nextLine(); // String to hold the first line of the file
Scanner parse = new Scanner(firstLine); // Scanner object to parse the first line (reads first line)
int row = parse.nextInt(); // Gets first token from Scanner object 'parse' to get # of rows
int col = parse.nextInt(); // Gets second token from Scanner object 'parse' to get # of columns
if(parse.hasNext()) { // Checks if there are more than two tokens (for invalid4.dat)
throw new GridSizeException("Too many dimensions"); // If yes, throws created exception "GridSizeException"
} else { // HERE IS WHERE I NEED HELP W/ MY LOGIC!
int rowCount = 0; // Row counter even thought we already know the # of rows
while(read.hasNextLine()) { // While loop that loops until the end of the file
rowCount++; // row count is increased
if(rowCount > row) { // if row counter is > than our given # of rows, we will throw an exception
throw new GridSizeException("Too many rows");
}
String nextLine = read.nextLine(); // String to hold the next line of the file
parse = new Scanner(nextLine); // For parsing that next line
for(int j = 0; j < col; j++) { // Loops the same # of times as the # of columns
double num = parse.nextDouble(); // Move through the String
if(j == col-1 && parse.hasNext()) { // Checks if there are more numbers in that row than expected.
throw new GridSizeException("Too many columns");
}
}
}
System.out.println(fileName);
System.out.println("VALID");
System.out.println();
}
} catch (FileNotFoundException e){
System.out.println(fileName);
System.out.println(e.toString() + " for input string: " + fileName);
System.out.println("INVALID\n");
} catch (NumberFormatException e) {
System.out.println(fileName);
System.out.println(e.toString() + " for input string: " + fileName);
System.out.println("INVALID\n");
} catch (InputMismatchException e) {
System.out.println(fileName);
System.out.println(e.toString() + " for input string: " + fileName);
System.out.println("INVALID\n");
} catch (GridSizeException e) {
System.out.println(fileName);
System.out.println(e.toString() + " for input string: " + fileName);
System.out.println("INVALID\n");
}
}
}
}
当您使用扫描仪读取行时,请使用 string.split(" ")(或任何分隔值的方法)
split() 的结果是一个字符串数组,您可以
- 用 array.length 检查值的数量(并确定是否有足够的值,或者有错误)
- 将单个字符串转换为数字并捕获异常(如果数字无效)
我在 Java 编程和编程方面相当陌生。目前我正在学习异常以及如何处理它们。在这个实验中,我得到了多个文本文件,其中包含以类似网格的方式显示的数字。我被告知使用命令行参数一次性 运行 所有文件。
The way the text files look (screenshot)
所有文件命名有效或无效。无效文件中有一些我必须检查的独特错误。每个文本文件的第一行给出总行数和列数。我一直想弄清楚如何检查文本文件的有效性:invalid2、invalid5 和 invalid7。我可以编写一些错误的代码来捕获文件 invalid5 和 invalid7 中的错误(我不想这样做),但是 invalid2 确实让我很为难。 invalid2 的问题是文件中的第一行告诉我网格有 3 行 和 4 列,但实际网格有 4 行 和 3 列 。
invalid2 text file screenshot
我目前正在尝试将网格分成 个人 行。我的逻辑(这里是我想知道它是否有问题的地方)是我正在使用一个 while 循环来检查文本文件中是否有下一行。如果有,我将增加我的行计数器(即使我已经知道网格有多少行)。然后我检查行计数器是否大于给定的实际行数,这会引发行太多的异常。如果没有,我将继续解析网格的每一行。我使用一个字符串“nextLine”,它包含网格那一行中的所有数字,并使用扫描仪“解析”解析该字符串。我使用一个 for 循环,它的运行次数与列数相同(文件给出的 #)。然后我设置 double 类型的变量“num”以获取该字符串中的下一个 double。此时我的程序崩溃了。我不知道为什么我在代码的那一行收到 NoSuchElementException。 Screenshot on Eclipse 我真的不需要对从文件中读取的信息做任何事情,所以“num”变量就在那里移动到行中的下一个数字。
我有两个问题
- 为什么我的那部分代码出现 NoSuchElementException?
- 我尝试检查每个文本文件有效性的逻辑是否正确?
控制台的输出应该如下所示:
valid1.dat
有效
在valid1.dat
java.lang.NumberFormatException:对于输入字符串:“X”
无效
等...
这是我的代码:
public class FormatChecker {
public static void main(String[] args) {
for(int n = 3; n < args.length; n++) { // Loops through command-line arguments
String fileName = args[n]; // Sets specific file
try {
File file = new File(fileName); // new File from specified file name
Scanner read = new Scanner(file); // Scanner object to read the new file
String firstLine = read.nextLine(); // String to hold the first line of the file
Scanner parse = new Scanner(firstLine); // Scanner object to parse the first line (reads first line)
int row = parse.nextInt(); // Gets first token from Scanner object 'parse' to get # of rows
int col = parse.nextInt(); // Gets second token from Scanner object 'parse' to get # of columns
if(parse.hasNext()) { // Checks if there are more than two tokens (for invalid4.dat)
throw new GridSizeException("Too many dimensions"); // If yes, throws created exception "GridSizeException"
} else { // HERE IS WHERE I NEED HELP W/ MY LOGIC!
int rowCount = 0; // Row counter even thought we already know the # of rows
while(read.hasNextLine()) { // While loop that loops until the end of the file
rowCount++; // row count is increased
if(rowCount > row) { // if row counter is > than our given # of rows, we will throw an exception
throw new GridSizeException("Too many rows");
}
String nextLine = read.nextLine(); // String to hold the next line of the file
parse = new Scanner(nextLine); // For parsing that next line
for(int j = 0; j < col; j++) { // Loops the same # of times as the # of columns
double num = parse.nextDouble(); // Move through the String
if(j == col-1 && parse.hasNext()) { // Checks if there are more numbers in that row than expected.
throw new GridSizeException("Too many columns");
}
}
}
System.out.println(fileName);
System.out.println("VALID");
System.out.println();
}
} catch (FileNotFoundException e){
System.out.println(fileName);
System.out.println(e.toString() + " for input string: " + fileName);
System.out.println("INVALID\n");
} catch (NumberFormatException e) {
System.out.println(fileName);
System.out.println(e.toString() + " for input string: " + fileName);
System.out.println("INVALID\n");
} catch (InputMismatchException e) {
System.out.println(fileName);
System.out.println(e.toString() + " for input string: " + fileName);
System.out.println("INVALID\n");
} catch (GridSizeException e) {
System.out.println(fileName);
System.out.println(e.toString() + " for input string: " + fileName);
System.out.println("INVALID\n");
}
}
}
}
当您使用扫描仪读取行时,请使用 string.split(" ")(或任何分隔值的方法)
split() 的结果是一个字符串数组,您可以
- 用 array.length 检查值的数量(并确定是否有足够的值,或者有错误)
- 将单个字符串转换为数字并捕获异常(如果数字无效)