如何获取一个与平台无关的换行符?

588
如何在Java中获得一个与平台无关的换行符?我不能在每个地方都使用"\n"。

请考虑更改已接受的答案。第二个答案更为合适。 - Gray
10个回答

758

8
他们如果提供了一个重载方法 lineSeperator(int) 并返回一些行分隔符的数量,那就太好了,因为我经常需要同时使用两个。 - Kon
11
基于这个回答String.join("", Collections.nCopies(5, System.lineSeparator())) 可以将五个行分隔符拼接成一个字符串。 - Samuel Harmer
11
使用Java 11:System.lineSeparator().repeat(5) 可以重复输出5次系统换行符。 - Jacob G.
5
@JacobG 停止沾沾自喜,我们中的一些人仍然停留在Java 7上。 - Andrew T Finnell
@AndrewTFinnell 我会找到一份更好的工作 <:-P 没有容器 -> 没有Java 11,所以你为了更好的薪水而留下来,我们可以沾沾自喜 :-D - Aubergine

658

您可以使用

System.getProperty("line.separator");

获取行分隔符


5
可以详细说明Java 7中的 System.lineSeparator(),以便回答这个问题吗? - Gray

377

除了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 Formatter API了解更多细节。


8
谢谢!我相信System.getProperty("line.separator")有它的用处,但是我厌倦了看到:"Line 1" + System.getProperty("line.separator") + "Line 2"这样的写法。 - Buttons840
45
哦天啊,“Line 1” + System.getProperty("line.separator") + "Line 2" 真是我见过的最丑陋的东西之一。在其他地方声明一个常量会更容易些。 - abahgat
4
这样做行不通,至少在一个传入log4j语句的字符串中是这样。在结尾处创建一个带有换行符的示例可能会掩盖问题。此外,使用“%%n”来表示字符串s2只会让人感到困惑。 - Stealth Rabbi
7
如果您的字符串可能包含来自用户输入的百分号,请勿使用此功能! - Konstantin Weitz
10
@KonstantinWeitz,使用String.format(s + "%n")的问题可以通过使用String.format("%s%n", s)轻松解决。将用户输入作为格式化字符串(与eval()类似)总是存在风险的。 - Franklin Yu
显示剩余7条评论

41
如果你想在文件中写入一个换行符,你可以使用 BufferedWriter 的 newLine() 方法。

29
这也是可行的:String.format("%n")。或者使用String.format("%n").intern()以节省一些字节。

8
这与Alex B的答案相同。 - Spoike
16
现在我明白了。他在回答中写了很多不必要的内容。;-) - ceving
我已经尝试过这样做,但是当我在记事本中查看文件时,它无法识别换行符。 - mr5
1
@mr5 notepad 不是查看文件内容的正确工具。请使用 hexdumpod - ceving
@ceving 我在Windows环境下,我期望换行符是\r\n的组合。 - mr5
@mr5 继续从ceving的评论中提到的内容:您还可以使用Notepad ++,Sublime Text或VS Code。所有这些工具都可以确定行尾是'\n'还是'\r\n' - Agi Hammerthief

23

21
好的,安装第三方库只是为了获得平台无关的换行符! #摊手 - Shervin Asgari
26
@Shervin 当然你不会这样做,但我所参与的许多项目已经在使用 commons-lang 和一些较旧版本的 Java。因此,如果您已经在使用 commons-lang,则这是一个明智的答案。我没有觉得有必要指出这一点,显然我错了。 - lexicalscope
3
这确实是一个对于已经在使用这个库的项目来说很好的建议,谢谢! - Alexis Leclerc

16
StringBuilder newLine=new StringBuilder();
newLine.append("abc");
newline.append(System.getProperty("line.separator"));
newline.append("def");
String output=newline.toString();

无论在哪个平台上,上述代码段将会有两个字符串,并用换行符分隔。


11
如果您正在使用BufferedWriter实例将内容写入文件中,请使用该实例的newLine()方法。它提供了一种跨平台的方式来在文件中写入新行。

2
这个答案是Mike Meyers的副本 - Agi Hammerthief

-2
自JDK 1.1以来,BufferedWriter类具有“newLine()”方法,该方法编写了平台相关的新行。它还提供了StringWriter类,使得可以提取新行:
public static String getSystemNewLine() {
    try {
        StringWriter sw = new StringWriter();
        BufferedWriter bw = new BufferedWriter(sw);
        bw.newLine();
        bw.flush();
        String s = sw.toString();
        bw.close();
        return s;
    } catch (Exception e) {
        throw new Error(e);
    }
}

-5
避免使用 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( );

21
大多数情况下这并不重要,编程恐怖的Jeff Atwood在他的博客中就这种微小优化做过文章。在声称“不要使用'string + string'”之类的内容之前,请先进行度量。 - Spoike
6
我认为Jeff的文章可能有些偏颇,因为它只涉及执行时间。Java中的字符串连接不仅与执行速度有关,还与在内存中留下多少垃圾需要GC清理有关,这可能会导致GC更频繁地运行。这可能或可能不是一个问题,具体取决于你的环境和配置。 - Lajcik
8
我怀疑在除了那些需要大量操作字符串的情况下,Lajcik的建议可能是过度优化了。StringBuffer对于小型拼接需求来说是一种反模式。在许多情况下,我更愿意使用可读性更强的String1+分隔符+String2,而不是上面提到的多行例子。此外,我建议测试一下是否通过添加StringBuffer有益于内存和垃圾回收。在很多情况下,我认为这并没有什么作用。如果没有值得测试的价值,那么这可能是过早优化,我会更注重代码的可读性。 - Richard Watson
33
在现代编译器中,执行 String1 + String2 与执行 new StringBuilder(String1).append(String2) 是相同的,因此对于单行字符串连接没有任何优化。StringBuilder 一般仅在循环或递归方法中才值得使用。但无论如何,这可能超出了原始问题的范围。 - user327961
1
@user327961:真实的故事。你可以轻松地使用你最喜欢的IDE和调试器来证明这一点。 - Atmocreations

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