Java 扫描仪只能读取文件行数的一半
我正在尝试使用具有以下代码的Scanner对象读取文件-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
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”,这可以解释这一点。