java Scanner只读取前2048个字节

时间:2013-06-26 05:59:25

标签: java windows macos java.util.scanner

我正在使用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后,同样的测试失败了。 我试图谷歌但没有找到太多=(

为什么Scanner with delimiter \ Z在win7上将我的整个文件读成一个字符串,但不会在mac上执行? 我知道有更多的方法来阅读文件,但我喜欢这个单行,并想了解它为什么不起作用。 感谢。

3 个答案:

答案 0 :(得分:2)

以下是java的一些信息

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

  

\ Z输入结束但是对于最终终结符,如果有的话

     

\ z输入的结尾

Line terminators

  

行终止符是一个或两个字符的序列,用于标记   输入字符序列的一行的结尾。以下是   被认为是行终止者:

     

换行符(换行符)('\ n'),一个回车符   紧接着是一个换行符(“\ r \ n”),一个独立的   回车符('\ r'),下一行字符('\ u0085'),A   行分隔符('\ u2028')或段落分隔符   字符('\ u2029)。

因此请使用\z代替\Z

答案 1 :(得分:1)

有一篇关于使用Scanner完全阅读文件的方法的文章很好:

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

简而言之:

  

因为应该读取带有“/ z”作为分隔符的单个读取   直到“输入结束”的所有内容,只做一个单一的诱惑   阅读并留待它,如上面列出的例子一样。

     

在大多数情况下没关系,但我发现至少有一种情况   读到“输入结束”不会读取整个输入 - 当时   input是一个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());
}

答案 2 :(得分:1)

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

我将其更改为明确告诉Scanner使用更大的缓冲区,并且它可以正常工作。

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