Java 我用Scanner类读取文件有什么问题?

Java 我用Scanner类读取文件有什么问题?,java,exception,Java,Exception,每次我运行它时,都会给出以下消息((InputMismatchException))问题出在哪里 File f = new File("nameList.txt"); try { PrintWriter out; out = new PrintWriter(f); for (int i = 0; i < 4; i++) { out.printf("Name : %s Age : %d ", "R

每次我运行它时,都会给出以下消息((InputMismatchException))问题出在哪里

        File f = new File("nameList.txt");
    try {
        PrintWriter out;
        out = new PrintWriter(f);
        for (int i = 0; i < 4; i++) {
            out.printf("Name : %s Age : %d ", "Rezaee-Hadi", 19);
            out.println("");
        }
        out.close();
    } catch (IOException ex) {
        System.out.println("Exception thrown : " + ex);
    }
    try {
        Scanner in = new Scanner(f);
        String name = in.nextLine();
        int age = in.nextInt();
        for (int i = 0; i < 4; i++) {
            System.out.println(name);
            System.out.println(age);
        }
        in.close();
    } catch (FileNotFoundException ex) {
        System.out.println("Exception thrown : " + ex);
    }
File f=新文件(“nameList.txt”);
试一试{
打印输出;
out=新的打印机(f);
对于(int i=0;i<4;i++){
out.printf(“姓名:%s年龄:%d”,“Rezaee Hadi”,19岁);
out.println(“”);
}
out.close();
}捕获(IOEX异常){
System.out.println(“抛出异常:“+ex”);
}
试一试{
扫描仪输入=新扫描仪(f);
字符串名称=in.nextLine();
int age=in.nextInt();
对于(int i=0;i<4;i++){
System.out.println(名称);
系统输出打印项次(年龄);
}
in.close();
}捕获(FileNotFoundException ex){
System.out.println(“抛出异常:“+ex”);
}
替换此:

        int age=0;
        while (in.hasNext()) {

            // if the next is a Int,
            // print found and the Int
            if (in.hasNextInt()) {
                 age = in.nextInt();
                System.out.println("Found Int value :"
                        + age);
            }
        }
取而代之的是:

  int age = in.nextInt();

然后您将不再获得“InputMismatchException”。

您正在以以下数据格式创建数据文件:

Name : Rezaee-Hadi Age : 19
现在,只要您意识到以后可能需要解析数据,那么(在某种程度上)如何格式化数据文件并不重要。您确实不需要在每个文件行上维护包含数据的标题。我们已经知道,任何文件行上的第一条数据是姓名,任何文件行上的第二条数据是姓名相关人员的年龄。因此,以下几点就足够了:

Rezaee-Hadi, 19
如果需要,可以将标题放置为数据文件的第一行,以便可以轻松确定每行上的每段数据与什么相关,例如:

Name, Age
Rezaee-Hadi, 19
Fred Flintstone, 32
Tom Jones, 66
John Smith, 54
Scanner in = new Scanner(f);
String dataLine;
while (in.hasNextLine()) {
    dataLine = in.nextLine().trim();
    // Skip Blank Lines
    if (dataLine.equals("")) {
        continue;
    }
    System.out.println(dataLine);
}
这实际上是CSV数据文件的典型格式

保持您已经使用的文件数据格式:

使用这种方法没有什么错。这是一个很好的方法,但您应该使用while循环逐行遍历文件,因为您可能并不总是确切知道文件中包含多少实际数据行,例如:

Name, Age
Rezaee-Hadi, 19
Fred Flintstone, 32
Tom Jones, 66
John Smith, 54
Scanner in = new Scanner(f);
String dataLine;
while (in.hasNextLine()) {
    dataLine = in.nextLine().trim();
    // Skip Blank Lines
    if (dataLine.equals("")) {
        continue;
    }
    System.out.println(dataLine);
}
这将打印文件中包含的所有数据行。但这不是你真正想要的,是吗。您希望从每行中分离姓名和年龄,这意味着您需要解析每行中的数据。一种方法(在您的情况下)是这样的:

String dataLine;
Scanner in = new Scanner(f);
while (in.hasNextLine()) {
    dataLine = in.nextLine().trim();
    // Skip Blank Lines
    if (dataLine.equals("")) {
        continue;
    }
    String[] dataParts = dataLine.replace("Name : " , "").split(" Age : ");
    System.out.println("The Person's Name: " + dataParts[0] + System.lineSeparator() 
                     + "The Person's Age:  " + dataParts[1] + System.lineSeparator());
}
在上面的代码中,我们使用while循环一次遍历整个数据文件一行。当每一行被读入数据行字符串变量时,它也会被删除任何前导或尾随空格。通常我们不想要这些。然后我们检查以确保该行不是空的。我们通常也不需要这些,在这里我们通过向while循环发出continue跳过这些空行,以便立即启动另一个迭代。如果文件行实际包含数据,那么它将保存在数据行变量中

现在我们要解析这些数据,以便检索名称和年龄,并将它们放入字符串数组中。我们通过使用该方法来实现这一点,但首先我们使用该方法去掉了行的“名称:”部分,因为我们不想在解析行时处理此文本。在该方法中,我们提供了一个要拆分的字符串分隔符,该分隔符为“Age:

现在,当解析每一行时,名称和年龄将作为位于索引0和索引1的元素包含在dataParts[]字符串数组中。现在,我们使用这些数组元素将结果显示到控制台窗口

此时,年龄是一个字符串,位于索引1处的dataParts[]数组中,但您可能希望将此年龄转换为整数(int)类型值。要做到这一点,您可以使用或方法,但在使用或方法之前,您应该验证将要传递给这些方法之一的字符串确实是字符串数字整数值这一事实。要做到这一点,您需要利用该方法和一个简单的小(RegEx):


放置在字符串#matches()方法中的正则表达式
“\\d+”
的基本意思是,“提供的字符串是整数的字符串表示形式吗?”。如果该方法发现它不是布尔值,则返回布尔值false。如果发现提供的值是字符串整数值,则返回布尔值true。这样做可以防止任何数字格式异常发生

in.nextLine()一直读取到行尾。下一个标记将是“Name”,程序试图将其解释为年龄变量的int。您输入什么,如何输入,确切的stacktrace是什么?@Stultuske我想打印文件中的所有数据确定。。然后呢?我不是真的问你的文件,我是问你如何使用ScannerVery输入数据完整和全面非常感谢