java扫描仪只读取前2048个字节

我正在使用java.util.Scanner从这个代码读取类path中的文件内容:

String path1 = getClass().getResource("/myfile.html").getFile(); System.out.println(new File(path1).length()); // 22244 (correct) String file1 = new Scanner(new File(path1)).useDelimiter("\\Z").next(); System.out.println(file1.length()); // 2048 (first 2k only) 

代码从命令运行(maventesting)

 /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/bin/java -Dmaven.home=/usr/share/java/maven-3.0.4 -Dclassworlds.conf=/usr/share/java/maven-3.0.4/bin/m2.conf -Didea.launcher.port=7533 "-Didea.launcher.bin.path=/Applications/IntelliJ IDEA 12 CE.app/bin" -Dfile.encoding=UTF-8 -classpath "/usr/share/java/maven-3.0.4/boot/plexus-classworlds-2.4.jar:/Applications/IntelliJ IDEA 12 CE.app/lib/idea_rt.jar" com.intellij.rt.execution.application.AppMain org.codehaus.classworlds.Launcher --fail-fast --strict-checksums test 

它在我的win7机器上完美运行。 但是,我搬到mac后,同样的testing失败。 我试图谷歌,但没有发现太多=(

为什么带分隔符\ Z的扫描仪读取我的整个文件到Win7的string,但不会在Mac上做到这一点? 我知道有更多的方法来读取文件,但我喜欢这一行,并想了解为什么它不工作。 谢谢。

Solutions Collecting From Web of "java扫描仪只读取前2048个字节"

这里是一些来自java的信息

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

\ Z输入结束,但最后终止符,如果有的话

\ z输入结束

线路终结器

行结束符是一个单字符或双字符序列,用于标记输入字符序列的一行的结尾。 以下是公认的行结束符:

一个换行符(换行符)('\ n'),一个回车符后跟一个换行符(“\ r \ n”),一个独立的回车符('\ r'),行字符('\ u0085'),行分隔符('\ u2028')或段落分隔符('\ u2029)。

所以使用\z而不是\Z

有一个关于这个完全用Scanner读取文件的方法的好文章:

http://closingbraces.net/2011/12/17/scanner-with-z-regex/

简单来说:

因为以“/ z”作为分隔符的单个读取应该读取所​​有内容,直到“输入结束”,所以很容易只做一次读取并保留,就像上面列出的例子一样。

在大多数情况下,这是可以的,但是我发现至少有一种情况,读到“输入结束”不会读取整个输入 – 当输入是一个SequenceInputStream时,每个InputStreams组成一个单独的“结束的投入“。 因此,如果使用“/ z”分隔符执行单个读取操作,它将返回SequenceInputStream的第一个组成流的内容,但不会读入组成流的其余部分。

谨防使用它。 最好是逐行读取,或者使用hasNext()检查,直到它是真实的false

UPD:换句话说,试试这个代码:

 StringBuilder file1 = new StringBuilder(); Scanner scanner = new Scanner(new File(path1)).useDelimiter("\\Z"); while (scanner.hasNext()) { file1.append(scanner.next()); } 

在Mac上使用nextLine()时,我遇到了这个问题,Java 7 update 45.更糟糕的是,在长度超过2048字节的行之后,文件的其余部分被忽略,Scanner认为它已经是文件的结尾。

我改变它明确告诉扫描仪使用较大的缓冲区,它的工作原理。

 Scanner sc = new Scanner(new BufferedInputStream(new FileInputStream(nf), 20*1024*1024), "utf-8");