Java中是否有像C#中的Environment.Newline一样定义换行符的常量?

228
在C#中,存在一个名为Environment.NewLine 的静态属性,它会根据运行平台而发生变化。
在Java中是否有类似的东西?
3个回答

331

93

Java 7起:

System.lineSeparator()

Java API : System.lineSeparator

返回依赖于系统的换行符字符串。它始终返回相同的值 - 系统属性line.separator的初始值。在UNIX系统上,它返回"\n";在Microsoft Windows系统上,它返回"\r\n"。


70

请注意,这个属性并没有很多人想象中那么有用。举个例子,仅仅因为你的应用程序在Windows机器上运行,并不意味着它读取的文件一定使用Windows风格的换行符。许多网页包含混合了 \n\r\n 的内容,这些内容来自于不同的来源。当你将文本作为逻辑行的系列进行读取时,你应该总是查找所有三种主要的行分隔符风格:Windows的\r\n、Unix/Linux/OSX的\n,以及早期的Mac的\r

当你编写文本时,你应该更关心文件将如何使用,而不是你运行的平台。例如,如果你希望人们在Windows记事本中阅读该文件,你应该使用\r\n,因为它只识别一种分隔符。


1
传统的 Mac(“\r”)还在实际使用中吗?或者说它可以被安全地“遗忘”了吗? - Pacerier
7
无论这些机器本身是否仍在使用,你都必须假设仍然存在着在早期OSX Mac上写入的文件。我知道将 (?:\r?\n|\r) 缩短为 (?:\r?n) 是很诱人的,但是不,我认为这样并不安全。无论如何,我更喜欢 (?:\r\n|[\r\n]);我知道这样更多字符,但它看起来更整洁。:D 如果你不关心消耗了多少个行分隔符,[\r\n]+ 也可以正常工作。 - Alan Moore
完全同意... 如果你的软件针对特定环境,静态常量仍然有其存在的价值。 - Marco Pelegrini
最佳答案。我需要生成一个TXT文件,其行分隔符需要是CRLF,并且我的Web应用程序通常在Linux上运行(但不总是)。使用lineSeparator将无法正常工作。 - Lluis Martinez
关于写作。如果您正在生成一个 Excel 文件并编写一个多行单元格值,其中行用 \n 连接,那么在 Windows 中,在 Excel 中,用户将看到这些行为单个行而在 Ubuntu 的 LibreOffce Calc 中则会看到它们作为单独的行。 - Burst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接