2011-05-07 70 views
2

我找不到指定默认情况下扫描仪如何处理换行符模式的文档。我想逐行读取一个文件,并让扫描器能够处理\ r,\ n或\ r \ n行尾,而不管程序实际运行的系统如何。Java扫描仪换行识别

我若像这样一台扫描仪:

Scanner scanner = new Scanner(reader); 

什么是默认的行为?它会处理所有三种如上所述,还是我必须明确地告诉它做到这一点?

+0

试试看看会发生什么。使用不同的EOL字符串创建3个不同的文件。 – camickr 2011-05-07 03:29:26

+2

其实,这是一个“尝试并看到”不会给你完整答案的情况! – 2011-05-07 04:16:37

+0

@Setphen C,问是否处理“\ r”,“\ n”或“\ r \ n”。这很容易测试和验证。是的,完整的答案是它也支持unicodes字符,但这不是问题。正确的问题应该是“通过测试扫描仪我注意到它支持\ r,\ n \ r \ n,它是否支持其他任何内容?”。海报采取了懒惰的方式,并永远不会学习简单的解决问题的技巧,如果人们保持勺子喂食的答案,很容易测试。 – camickr 2011-05-07 04:52:30

回答

5

查看Sun JDK 1.6的源代码,使用的模式是“\ r \ n | [\ n \ r \ u2028 \ u2029 \ u0085]”

它分别表示“\ r \ n”或者\ r,\ n中的任意一个或者“行分隔符”,“段落分隔符”和“下一行”的Unicode字符。

+0

谢谢,这就是我需要知道的。一点测试表明这是真的。如果我没有指定分隔符并使用'scanner.hasNext',那么它会将'\ r','\ n'和'\ r \ n'视为行尾。 – Anthony 2011-05-07 04:13:03

3

它不记录(在Java 1.6的),但是JDK代码使用这个正则表达式匹配换行符:

"\r\n|[\n\r\u2028\u2029\u0085]" 

这里的源代码的链接:http://cr.openjdk.java.net/~briangoetz/7012540/webrev/src/share/classes/java/util/Scanner.java.html

IMO,这应该因为Scanner对行分隔符的行为不同于(例如)BufferedReader的行为。 (我提交了一个错误报告......)

+0

这不会发生在斯蒂芬克劳利身上吗? – Anthony 2011-05-07 04:27:48

+0

@Duracell - 不,它不会 – 2011-05-07 04:32:01

+0

Phew。我目前正在使用Java语言进行软件设计课程,并且有一位Stephen C.的讲师让我兴奋不已。 – Anthony 2011-05-07 04:36:45