使用逗号分隔符错误从文件读取

时间:2016-10-06 04:37:43

标签: java arraylist io readfile

这是我试图从

中读取的.txt文件
20,Dan,09/05/1990,3,Here
5,Danezo,04/09/1990,99,There

这就是我在做的方式..每当.txt文件只有一行时,它似乎正在从文件中读取。每当读取多行时,我都会收到此错误

Exception in thread "main" java.lang.NumberFormatException: For input string: "Danezo"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at AttackMonitor.readFromFile(AttackMonitor.java:137)
at AttackMonitor.monitor(AttackMonitor.java:57)
at MonsterAttackDriver.main(MonsterAttackDriver.java:14)
Java Result: 1

这是readfromfile代码。

 private void readFromFile() throws FileNotFoundException, IOException
    {
        monsterAttacks.clear();
        Scanner read = new Scanner(new File("Attacks.txt"));
        read.useDelimiter(",");
        String fullDateIn = "";
        int attackIdIn = 0;
        int attackVictimsIn = 0;
        String monsterNameIn= "";
        String attackLocationIn= "";
        while (read.hasNext())
        {
           attackIdIn = Integer.parseInt(read.next());
           monsterNameIn = read.next();
           fullDateIn = read.next();
           attackVictimsIn = Integer.parseInt(read.next());
           attackLocationIn = read.next();
           monsterAttacks.add(new MonsterAttack(fullDateIn, attackIdIn, attackVictimsIn, monsterNameIn, attackLocationIn));

        }
        read.close();
    }

4 个答案:

答案 0 :(得分:2)

发生的事情是,每行末尾都有一个换行符,当前不是分隔符。所以你的代码试图将它读作下一行的第一个整数,而不是。这导致了解析异常。

要解决此问题,您可以尝试将新行添加到要扫描的分隔符列表中:

Scanner read = new Scanner(new File("Attacks.txt"));
read.useDelimiter("[,\r\n]+");  // use just \n on Linux

另一种方法是从文件中读取每一行,然后用逗号分隔:

String[] parts = read.nextLine().split(",");

attackIdIn = Integer.parseInt(parts[0]);
monsterNameIn = parts[1];
fullDateIn = parts[2];
attackVictimsIn = Integer.parseInt(parts[3]);
attackLocationIn = parts[4];

答案 1 :(得分:0)

您可以使用Biegeleisen建议。否则你可以这样做。 在while循环中,您使用hasNext作为条件。而不是你可以使用while (read.hasNextLine())并在循环中获取nextLine,然后通过分隔符将其拆分并进行处理。那将是一种更合适的方法。

e.g

while (read.hasNextLine()) {
    String[] values = scanner.nextLine().split(".");
    // do your rest of the logic
}

答案 2 :(得分:0)

将while循环内容放在try catch中,并捕获NumberFormatException。因此,无论何时捕获代码,您都可以理解您尝试将字符串转换为int。 如果您的业务得到解释,可以提供更多帮助。

答案 3 :(得分:-1)

attackLocationIn = read.next();此值取为"此处\ n 5"因为Here和5之间没有逗号,它有新行字符。 所以第二次迭代attackIdIn = Integer.parseInt(read.next());这里read.next()值是" Danezo"它是String,你正在尝试解析Integer。这就是你得到这个例外的原因。

我的建议是使用BufferReader逐行阅读并用逗号分隔每一行。它也会很快。

或其他解决方案在每行末尾添加逗号并在代码中使用read.next().trim()。这就是它适用于您当前代码的最小更改。