使用Scanner(InputMismatchException)使用read方法读取文件

时间:2013-10-23 16:07:44

标签: token readfile file-io inputmismatchexception

我是java的新手,我在使用scanner类读取文件时遇到问题。

我的目标是阅读以下.txt文件:

3
Emmalaan 23 
3051JC Rotterdam 
7 rooms 
price 300000 
Javastraat 88 
4078KB Eindhoven 
3 rooms 
price 50000 
Javastraat 93 
4078KB Eindhoven 
4 rooms 
price 55000 

文件顶部的“3”应该读作一个整数,告诉该文件有多少个房屋。 “3”之后的以下四行确定了一个房子。

我尝试使用类portefeuille中的read方法读取此文件:

public static Portefeuille read(String infile)
    {
        Portefeuille returnvalue = new Portefeuille();


        try 
        {
            Scanner scan = new Scanner(new File(infile)).useDelimiter(" |/n");
            int aantalwoningen = scan.nextInt();
            for(int i = 0; i<aantalwoningen; ++i)
            {

                Woning.read(scan);  
            }

        }

        catch (FileNotFoundException e) 
        {
            System.out.println("File could not be found");
        }

        catch (IOException e) 
        {
            System.out.println("Exception while reading the file");
        }

        return returnvalue;
    }

Woning类中的read方法如下所示:

public static Woning read(Scanner sc)
    {


        String token_adres = sc.next();
        String token_dr = sc.next();
        String token_postcd = sc.next();
        String token_plaats = sc.next();
        int token_vraagPrijs = sc.nextInt();
        String token_kamerstxt = sc.next();
        String token_prijstxt = sc.next();
        int token_kamers = sc.nextInt();

        return new Woning(adresp, token_vraagPrijs, token_kamers);  

    }

当我尝试执行以下代码时:

Portefeuille port1 = Portefeuille.read("woningen.txt");

我收到以下错误:

Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:840)
    at java.util.Scanner.next(Scanner.java:1461)
    at java.util.Scanner.nextInt(Scanner.java:2091)
    at java.util.Scanner.nextInt(Scanner.java:2050)
    at Portefeuille.read(Portefeuille.java:48)
    at Portefeuille.main(Portefeuille.java:112)

但是,如果我使用Woning类中的read方法以字符串格式读取一个adres:

Emmalaan 23
3051JC Rotterdam
7 Rooms 
price 300000

工作正常。

我尝试将.txt文件更改为只有一个地址而不是顶部的“3”,这样它的格式就像应该工作的地址一样。但是当我从Woning类调用read方法时,它仍然给我错误。

有人可以帮我解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我也面临着类似的问题,所以我提出了自己的答案,以便将来对您有所帮助:

为了使此代码运行,我做了两个可能的修改。

  • 第一个选择:创建Scanner类时,将useDelimiter方法的使用更改为.useDelimiter("\\r\\n"),因为我在Windows中,所以我们可能需要\\ r才能与Windows兼容。

使用此修改,不会有异常。但是代码将再次在int token_vraagPrijs = sc.nextInt();处失败。

因为在public static Woning read(Scanner sc)中,您正在起诉sc.next();。实际上,此方法从此扫描程序中查找并返回下一个完整令牌。在完整令牌之前和之后是与定界符模式匹配的输入。

因此,每个sc.next()实际上正在读取一行而不是令牌。 因此,根据您的代码sc.nextInt()尝试读取类似Javastraat 88的内容,因此同样会给您同样的异常。

  • 第二个选项(首选):不要使用任何定界符,Scanner类将使用默认空格,您的代码将正常工作。我修改了代码,对我来说很好。

代码:

public class Test3{                                                                                
  public static void main(String... s)
    {
    read("test.txt");
    }

public static void read(String infile)
{
    try (Scanner scan = new Scanner(new File(infile)))
    {
        int aantalwoningen = scan.nextInt();
        System.out.println(aantalwoningen);
        for (int i = 0; i < aantalwoningen; ++i)
        {
            read(scan);
        }
    }
    catch (FileNotFoundException e)
    {
        System.out.println("File could not be found");
    }
}

public static void read(Scanner sc)
{

    String token_adres = sc.next();
    String token_dr = sc.next();
    String token_postcd = sc.next();
    String token_plaats = sc.next();
    int token_vraagPrijs = sc.nextInt();
    String token_kamerstxt = sc.next();
    String token_prijstxt = sc.next();
    int token_kamers = sc.nextInt();
    System.out.println(token_adres + " " + token_dr + " " + token_postcd + " " + token_plaats + " "
        + token_vraagPrijs + " " + token_kamerstxt + " " + token_prijstxt + " " + token_kamers);

} }