如何在 StringBuilder 中追加换行符

290

我有一个StringBuilder对象,

StringBuilder result = new StringBuilder();
result.append(someChar);

现在我想向StringBuilder追加一个新的换行符。我该如何做?

result.append("/n"); 

无效。所以,我在考虑使用Unicode编写一个换行符。这样会有帮助吗?如果可以,我该如何添加一个?


26
我认为它是 "\n",或 System.getProperty("line.separator") - Alvin Wong
一个换行符并不一定是一个LF(Ascii/Unicode 10)字符。正如正确的答案所指出的,在Java中你可以得到这两个(LINE FEED或特定于平台的换行符)。 - Basil Bourque
7个回答

604

它应该是

r.append("\n");

但我建议你按照以下方式操作:

r.append(System.getProperty("line.separator"));

System.getProperty("line.separator") 在Java中可以获取与系统相关的换行符。从Java 7开始,还有一种方法可以直接返回该值:System.lineSeparator()


112
对于System.lineSeparator快捷方式,我给出+1的赞同。更大的问题是为什么没有StringBuilder#appendLine()方法。 - Patrick M
23
System.lineSeparator()方法的文档中提到“返回与系统相关的换行符字符串”。这不是跨平台的。如果您需要编写一个将被底层操作系统使用的字符串,请使用此代码,否则请使用'\n' - tuscland
2
@tuscland - 为什么不一直使用System.lineSeparator()呢?为什么'\n'是更好的默认选项? - RyanfaeScotland
21
不,当您处理非可移植资源(即特定于底层操作系统的资源)时,应使用System.lineSeparator()。它在Windows(\r\n)或Unix(\n)上运行Java时具有不同的值。如果您始终使用System.lineSeparator(),则会生成非可移植文件。 - tuscland
10
令人难以置信的是,StringBuilder 上还没有 appendLine 的重载。 - Josh M.
显示剩余3条评论

30

另一个选项是使用Apache Commons StrBuilder,它具有StringBuilder缺少的功能。

StrBuilder.appendLn()

从3.6版本开始,StrBuilder已被弃用,推荐使用TextStringBuilder,它具有相同的功能。


7
自从Java 8开始,就有StringJoiner,它“用于构造由分隔符分隔的字符序列,可选择以提供的前缀开头并以提供的后缀结尾。” 使用"\n"作为分隔符将导致换行(除了最后一个)。在内部,它使用StringBuilder。我认为可以使用Google Guava Joiner实现相同的方法。 - jechterhoff
1
现在这个方法已经被弃用,请使用org.apache.commons.text.TextStringBuilder - Ashok M A
TextStringBuilder 不在 commons-lang3 库中,而是在 commons-text 库中。请访问 https://commons.apache.org/proper/commons-text/。 - Salvatorelab

20

转义应该使用\,而不是/

所以r.append('\n');r.append("\n");都可以使用(StringBuilder具有重载的方法,用于charString类型)。


6

我创建了一个类,类似于StringBuilder,并且可以通过调用appendLine(String str)方法来添加新行。

public class StringBuilderPlus {

    private StringBuilder sb;

    public StringBuilderPlus(){
         sb = new StringBuilder();
    }

    public void append(String str)
    {
        sb.append(str != null ? str : "");
    }

    public void appendLine(String str)
    {
        sb.append(str != null ? str : "").append(System.getProperty("line.separator"));
    }

    public String toString()
    {
        return sb.toString();
    }
}

使用方法:

StringBuilderPlus sb = new StringBuilderPlus();
sb.appendLine("aaaaa");
sb.appendLine("bbbbb");
System.out.println(sb.toString());

控制台:

aaaaa
bbbbb

5
您也可以在 String.format 中使用行分隔符字符(请参见 java.util.Formatter),这也是与平台无关的。
例如:
result.append(String.format("%n", ""));

如果需要添加更多的行间距,只需使用:
result.append(String.format("%n%n", ""));

您还可以使用StringFormat来格式化整个字符串,在结尾处加上换行符。

result.append(String.format("%10s%n%n", "This is my string."));

3
你可以使用line.seperator来添加新行。

2

除了K.S提出的创建StringBuilderPlus类并利用适配器模式扩展最终类的响应外,如果你利用泛型并在新的append和appendLine方法中返回StringBuilderPlus对象,你可以利用StringBuilders的许多追加方法来处理所有不同类型的字符串,同时恢复将多个追加命令拼接成一个字符串的能力,如下所示:

public class StringBuilderPlus {

    private final StringBuilder stringBuilder;

    public StringBuilderPlus() {
        this.stringBuilder = new StringBuilder();
    }

    public <T> StringBuilderPlus append(T t) {
        stringBuilder.append(t);
        return this;
    }

    public <T> StringBuilderPlus appendLine(T t) {
        stringBuilder.append(t).append(System.lineSeparator());
        return this;
    }

    @Override
    public String toString() {
        return stringBuilder.toString();
    }

    public StringBuilder getStringBuilder() {
        return stringBuilder;
    }
}

你可以像使用原始的StringBuilder类一样使用它:
StringBuilderPlus stringBuilder = new StringBuilderPlus();
stringBuilder.appendLine("test")
    .appendLine('c')
    .appendLine(1)
    .appendLine(1.2)
    .appendLine(1L);

stringBuilder.toString();

这里有相当多的转换问题。 - AnthonyJClink

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