如何获得与平台有关的换行符?


Answers:


363

除了line.separator属性,如果您使用的是Java 1.5或更高版本和的String.format(或其他格式化方法),可以使用%n

Calendar c = ...;
String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY%n", c); 
//Note `%n` at end of line                                  ^^

String s2 = String.format("Use %%n as a platform independent newline.%n"); 
//         %% becomes %        ^^
//                                        and `%n` becomes newline   ^^

有关更多详细信息,请参见Java 1.8 API for Formatter


7
谢谢!我确定System.getProperty(“ line.separator”); 有它的用途,但是我
讨厌

43
哦,我的“第1行” + System.getProperty(“ line.separator”)+“第2行”确实是我见过的最丑陋的东西之一。只需在其他地方声明一个常量就不会那么痛苦。
2011年

4
至少在将字符串输入到log4j语句中时,这至少不起作用。创建一个末尾带有换行符的示例可能会隐藏问题。此外,串S只是混淆使用“%% N”
隐形拉比

6
如果您的字符串可能包含%来自用户输入的内容,请不要使用它!
康斯坦丁·威茨

8
@KonstantinWeitz的问题String.format(s + "%n")很容易通过解决String.format("%s%n", s)。将用户输入作为格式主体总是有风险的(与相同eval())。
富兰克林·于

709

Java 7现在有一个System.lineSeparator()方法。


8
他们本来会很好的提供一个重载方法lineSeperator(int),该方法返回一些行分隔符,因为我经常发现自己一次使用2。
2016年

10
@Kon基于此答案String.join("", Collections.nCopies(5, System.lineSeparator()))
塞缪尔·哈默

4
使用Java 11:System.lineSeparator().repeat(5)
Jacob G.19年

4
@JacobG停止幸灾乐祸..我们有些人仍然停留在Java 7中
安德鲁牛逼Finnell

@AndrewTFinnell我会找到更好的工作<:-P没有容器->没有Java 11,所以您为获得更好的薪水而留着,我们可以幸灾乐祸:-D
茄子

649

您可以使用

System.getProperty("line.separator");

得到行分隔符


4
希望添加Java 7 System.lineSeparator()详细信息,因此这里是该问题的明确答案?
灰色灰色


31

这也是可能的:String.format("%n")

String.format("%n").intern()保存一些字节。


7
这与Alex B的答案相同。
Spoike

16
哦,现在我明白了。他在回答中写了很多未提出要求的东西。;-)
ceving 2013年

我尝试这样做,但是当我在记事本中查看文件时,它无法识别换行符。
mr5

1
@ mr5 notepad不是查看文件内容的正确工具。使用hexdumpod
2015年

@ceving我在Windows环境中,我期望换行符是\r\n
mr5 2015年

22

公地郎库有一个可用的恒定场称为SystemUtils.LINE_SEPARATOR


19
是的,安装第三方库仅是为了获得与平台无关的新产品!#facepalm
Shervin Asgari

23
@Shervin当然不会这么做,但是我从事的许多项目已经在使用commons-lang和一些旧版本的Java。因此,如果您碰巧已经在使用commons-lang,那么这是一个明智的答案。我没有必要指出这一点,我显然是错的。
lexicalscope 2014年

2
对于已经在使用该库的项目,这确实是一个很好的建议,谢谢!
Alexis Leclerc 2014年



-3

避免使用String + String等附加字符串,而应使用StringBuilder。

String separator = System.getProperty( "line.separator" );
StringBuilder lines = new StringBuilder( line1 );
lines.append( separator );
lines.append( line2 );
lines.append( separator );
String result = lines.toString( );

20
在大多数情况下,这实际上并不重要,Coding Horror的Jeff Atwood发表了有关这种微优化的博客文章。在提出诸如“不做string + string”之类的声明之前,请务必做指标。
Spoike

6
我想说Jeff的文章可能有点过头,因为它只涉及执行时间。Java中的字符串连接不仅关系到执行速度,而且关系到内存中留有多少垃圾可以清理GC,这可能导致GC运行频率更高。根据您的环境和配置,这可能是问题,也可能不是问题。
Lajcik 2012年

7
Lajcik,我怀疑这是对所有情况的预优化,除了那些确实进行大量字符串操作的情况。StringBuffer是用于较小串联要求的反模式。在许多情况下,与上述多行示例相比,我宁愿具有可读的String1 +分隔符+ String2。此外,我建议通过添加SB测试内存和GC是否受到正面影响。在很多情况下,我猜不是这样。如果不值得测试,则可能是预先优化,我将重点放在可读性上。
理查德·沃森

31
在现代编译器中,执行String1 + String2与执行新的StringBuilder(String1).append(String2)相同,因此对于一个线性字符串concat根本没有优化。通常,仅在循环或递归方法中,StringBuilder值得这样做。但是无论如何,这可能超出了原始问题的范围。
user327961 2013年

@ user327961:真实的故事。可以使用您喜欢的IDE和调试器轻松证明这一点。
13年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.