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

我使用java.util.Scanner从以下代码的classpath中读取文件内容:

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)

代码从想法和命令运行(maven测试)

/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后,同样的测试失败。 我试图谷歌,但没有发现太多=(

为什么带分隔符 Z的扫描仪在win7上将整个文件读入字符串,但不会在mac上执行? 我知道有更多的方法来读取文件,但我喜欢这个单行文本,并且想知道为什么它不起作用。 谢谢。


这里有一些来自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时,每个组成输入流似乎给出一个单独的“结束的投入“。 因此,如果使用“/ 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");
链接地址: http://www.djcxy.com/p/72281.html

上一篇: java Scanner reads only first 2048 bytes

下一篇: Sort Order on column with multiple decimal places