2

我是 java 新手,使用扫描仪类读取文件时遇到问题。

我的目标是阅读以下 .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 中的读取方法读取此文件:

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 方法以字符串格式读取一个地址:

Emmalaan 23
3051JC Rotterdam
7 Rooms 
price 300000

它工作正常。

我试图将 .txt 文件更改为只有一个地址,顶部没有“3”,以便它的格式与应该工作的地址完全一样。但是当我从 Woning 类调用 read 方法时,它仍然给我错误。

谁能帮我解决这个问题?

谢谢!

4

1 回答 1

0

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

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

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

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

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

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

  • 第二个选项(首选):不要使用任何分隔符,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);

} }
于 2020-02-15T08:43:29.780 回答