扫描文件时跳过空白行

时间:2014-02-12 01:31:20

标签: java file-io blank-line

我有这种格式的文件:

Gray M 0 0 869 0 0 0 0 0 0 0 0 0 0 0

Mart M 722 957 0 0 0 0 0 0 0 0 0 0 0 0

Adolfo M 0 995 0 859 0 646 742 739 708 731 671 649 546 0

Livia F 0 0 0 0 0 0 0 0 0 0 0 0 0 826

Mearl M 0 0 947 0 0 0 0 0 0 0 0 0 0 0

Estel M 0 0 0 793 750 826 0 0 0 0 0 0 0 0

Lee F 300 333 278 256 281 310 283 268 218 298 364 955 0 0

Garnet F 0 704 663 464 421 665 721 0 0 0 0 0 0 0

Stephan M 0 0 0 922 0 0 757 333 387 395 487 406 721 0

(Last line in the file is a blank Line)

我的方法采用如下字符串:“Lee F”并将其与文件中一行的前两个标记进行比较。如果它匹配行上的前两个令牌,则返回两个令牌,如果它与文件中的任何内容都不匹配,则告诉用户它没有找到令牌。如果名称在文件中,我的程序运行正常,但如果名称不在文件中,则会出错:

Exception in thread "main"
 java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at Names.findName(Names.java:36)
    at Names.main(Names.java:9)

这是因为我的if语句检查空行似乎没有在文件的最后一个空白行上工作,我的代码试图从最后一行获取两个令牌....为什么不是'它是否跳过文件中的最后一个空行?

public static String findName(String nameGend) throws FileNotFoundException {
        Scanner input = new Scanner(new File("names.txt"));
        while (input.hasNextLine()) {
            String line = input.nextLine();
            if (!(line.isEmpty())) {
                String name= input.next();
                String gend= input.next();
                String nameGend2= name+ " " + gend;
                if (nameGend.equalsIgnoreCase(nameGend2)) {
                    input.close();
                    return nameGend2;
                }
            }
        }
        input.close();
        return "name/gender combination not found";
    }

1 个答案:

答案 0 :(得分:3)

String name= input.next();
String gend= input.next();

这似乎是一个问题(特别是如果你在最后一行)。您已经阅读了整行,为什么还要从input进一步阅读?如果没有别的东西可读怎么办?在空格上只需split() line,并将前两个元素提取为namegend

String[] split = line.split("\\s+", 3);

String name = split[0];
String gend = split[1];

请注意,split()的第二个参数表示该字符串最多只能拆分为3个(这是最佳的,因为我们只需要生成数组的前两个元素)。