Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扫描仪只能读取文件行数的一半_Java_Java.util.scanner_Bufferedreader - Fatal编程技术网

Java 扫描仪只能读取文件行数的一半

Java 扫描仪只能读取文件行数的一半,java,java.util.scanner,bufferedreader,Java,Java.util.scanner,Bufferedreader,我正在尝试使用具有以下代码的Scanner对象读取文件- public void read(){ Scanner scanner = new Scanner(dataFile).useDelimiter("\n"); String line; int i = 0; while(scanner.hasNext()){ line = scanner.next(); i++; } System.out.printl

我正在尝试使用具有以下代码的Scanner对象读取文件-

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);
}
有人能解释为什么扫描仪不能读取所有行吗?

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

您应该使用以下方法:

 hasNextLine() and nextLine() 

一个可能的原因可能是
扫描仪的(1KB)缓冲限制小于
缓冲读取器的(8KB)

有人能解释为什么扫描仪不能读取所有行吗


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

的行。以下程序适用于我:

    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();
原始程序的更改如下:

  • 将hasNext()和next()更改为hasNextLine()和nextLine()。在这种情况下,默认分隔符可以
  • 修正了打字错误-
    system.out.println
    应该是
    system.out.println
  • 在打印行中添加了注释(并检查分隔符是否正确)
  • 添加了scanner.close()

  • 我不确定,但我知道扫描仪有一个内部缓存缓冲区。似乎文件对于这个扫描对象来说太大了,BufferedReader没有这个问题。我不能复制这个-它对我来说很好。。。虽然您所说的已损坏的代码甚至没有编译(系统与系统),这让我想知道真正损坏的代码是否在某些方面有显著的不同。如果你能发布一个简短但完整的程序来演示这个问题,这将非常有帮助。文件中的行中有没有特殊字符?通常有多长?最长的一行有多长?@JonSkeet:将system.out.println()更改为system.out.println()。感谢您指出这一点。同样的实现也适用于其他小得多的文件。所以我猜这里的问题是线的数量。这是一个类似的问题。似乎有一个特殊的字符,使扫描器认为EOF就在那里。无论如何,BufferedReader似乎更健壮。即使使用.hasNextLine()和.nextLine(),扫描仪也不会超出同一行59554:(如果删除前59000行怎么办?第554行是否失败?如果删除前59554行,扫描仪读取0行。因此,扫描仪将文件中的某些奇怪字符解释为文件结尾。我用记事本++编辑器检查了文件,每行结尾都用LF。@acoolgue:不使用记事本++检查-使用二进制文件检查。)我无法查看所涉及的确切字节。例如,如果您有一个奇怪的分隔符“\n\r”,这可以解释这一点。