扫描仪缺少.txt文件的第一行

时间:2016-04-29 05:35:08

标签: java methods java.util.scanner

我认为我做的事情非常愚蠢,但我是Java新手,所以请耐心等待。我正在使用FileReader和Scanner来读取.txt文件的行。抓住每一行后,我提取一些信息然后移动线。这就是我的简化方法:

Reader fileReader = new FileReader("test.txt");
Scanner scanner = new Scanner(fileReader);

public static textList(Scanner scanner){
   while (scanner.hasNextLine()){
      scanner.nextLine();
      while(scanner.hasNext()){
         // Extract information from each line and do some stuff with it
         // using scanner.next();
      }
   }
}
// scanner is closed in the same method that creates it and the FileReader.

我的问题是,如果我将scanner.nextLine()保留在原来的位置,我将始终跳过.txt文件的第一行,但如果我将其移至while( scanner.hasNextLine())的末尾,当扫描程序到达.txt文件的末尾时,我得到“没有这样的行存在”异常。

非常感谢任何帮助和指导!

由于

2 个答案:

答案 0 :(得分:1)

解决这个问题的一个简单方法就是按照this answer的方式完成它 - 这样你甚至可以很好地解决多个空格:

String data = scanner.nextLine();
String[] pieces = data.split("\\s+");
// Parse the pieces

因为.next()默认只返回空格之后的内容,使用它而不是这里没有任何好处。

答案 1 :(得分:1)

阅读每行5个令牌的文本文件的最佳方法是不使用Scanner

Scanner速度很慢,往往表现得不像你想象的那样。

请改用BufferedReader。并使用try-with-resources来关闭它。

try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {
    for (String line; (line = reader.readLine()) != null; ) {
        String[] tokens = line.split("\\s+");
        // use tokens array here
    }
}

对于更高级的行解析,您可以使用带有捕获组的完整正则表达式,而不是split()

Pattern p = Pattern.compile("(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)");
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {
    for (String line; (line = reader.readLine()) != null; ) {
        Matcher m = p.matcher(line);
        if (! m.matches())
            throw new IllegalArgumentException("Bad data: " + line);
        String token1 = m.group(1);
        String token2 = m.group(2);
        String token3 = m.group(3);
        String token4 = m.group(4);
        String token5 = m.group(5);
        // use tokens here
    }
}

该代码与第一个示例相同,但强制每行必须有5个令牌。然后可以根据需要调整正则表达式,例如,使用\\d+代替\\S+来确保令牌3是一个数字。