如何读取文本文件的内容并检查它们在 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”变量就在那里移动到行中的下一个数字。

我有两个问题

  1. 为什么我的那部分代码出现 NoSuchElementException?
  2. 我尝试检查每个文本文件有效性的逻辑是否正确?

控制台的输出应该如下所示:

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 检查值的数量(并确定是否有足够的值,或者有错误)
  • 将单个字符串转换为数字并捕获异常(如果数字无效)