扫描仪读数只有一半。文件中的行数

时间:2014-01-24 15:31:15

标签: java java.util.scanner bufferedreader

我正在尝试使用以下代码使用Scanner Object读取文件 -

public void read(){
    Scanner scanner = new Scanner(dataFile).useDelimiter("\n");
    String line;
    int i = 0;
    while(scanner.hasNext()){
          line = scanner.next();
          i++;
    }
    System.out.println(i);
}

我想要读取的文件有117000行,其中扫描程序只读取前59550个奇数行。它不会抛出任何异常而只是返回。

当我更改实现以使用BufferedReader时,它会读取所有117000行 -

public void read(){
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(dataFile)));
    String line;
    int i=0;
    while((line = br.readLine())!= null){ 
          i++;
    }
    System.out.println(i);
}

任何人都可以解释为什么扫描仪无法读取所有行吗?

4 个答案:

答案 0 :(得分:1)

以下程序适合我:

    Scanner scanner = new Scanner(dataFile);
    String line;
    int i = 0;
    while(scanner.hasNextLine()){
          line = scanner.nextLine();
          // System.out.println(line); // remove comment for debug
          i++;
    }
    System.out.println(i);
    scanner.close();

原始计划的变更是:

  1. 将hasNext()和next()更改为hasNextLine()和nextLine()。在这种情况下,默认分隔符很好
  2. 修正了一个拼写错误 - system.out.println应为System.out.println
  3. 在打印行中添加了注释(并检查分隔符是否正常)
  4. 添加了scanner.close()

答案 1 :(得分:0)

可能与扫描仪使用的行结尾,分隔符有关。

您应该使用以下方法:

 hasNextLine() and nextLine() 

答案 2 :(得分:0)

一个可能的原因可能是Scanner的(1KB)缓冲区限制小于BufferedReader(8KB)。

答案 3 :(得分:0)

  

任何人都可以解释为什么扫描仪无法读取所有行吗?

br.readLine还会选择以\r(而不是\n)结尾的行。这是与您的扫描仪的一个重要区别,只能读取\n行。