如何将换行符追加到StringBuilder


234

我有一个StringBuilder对象

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

现在,我想在末尾添加一个换行符StringBuilder。我该怎么做?

result.append("/n"); 

不起作用。因此,我正在考虑使用Unicode编写换行符。请问有帮助吗?如果是这样,我如何添加一个?


23
我认为这是"\n",或System.getProperty("line.separator")
Alvin Wong

换行符不一定是换行(LF)(ASCII / 10的Unicode)字符。正如正确答案指出的那样,在Java中,您可以选择一个(LINE FEED或特定于平台的换行符)。
罗勒·布尔克

Answers:


510

它应该是

r.append("\n");

但我建议您按照以下步骤做,

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

System.getProperty("line.separator")在Java中为您提供依赖于系统的换行符。同样从Java 7开始,有一个方法可以直接返回值:System.lineSeparator()


87
+1为System.lineSeparator快捷方式。更大的问题是为什么没有StringBuilder#appendLine()方法。
Patrick M

14
System.lineSeparator()文档中提到“返回系统相关的行分隔符字符串”。这不是平台无关的。如果您需要编写将由基础操作系统使用的字符串,请使用此代码,否则请使用'\n'
tuscland

2
@tuscland-为什么不一直使用System.lineSeparator()?为什么'\ n'是更好的默认选项?
RyanfaeScotland

16
否,System.lineSeparator()在处理不可移植的资源(即特定于底层操作系统的资源)时应使用。如果您在Windows(\ r \ n)或Unix(\ n)上运行Java,则它具有不同的值。如果您一直使用System.lineSeparator(),则将产生不可移植的文件。
tuscland

6
令人难以置信的是,还没有appendLine过载StringBuilder
Josh M.

22

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

StrBuilder.appendLn()

从3.6版开始,不建议使用StrBuilder,而推荐使用具有相同功能的TextStringBuilder


5
...并且从Java 8开始,有了StringJoiner,它“ 用于构造由定界符分隔的字符序列,并可选地以提供的前缀开头并以提供的后缀结尾。 “使用“ \ n”作为定界符将导致新的行(最后一行除外)。在内部,它使用StringBuilder。我认为,使用Google Guava Joiner可以实现相同的方法。
jechterhoff

1
...现在是deprecated。请使用org.apache.commons.text.TextStringBuilder
Ashok MA,

16

逃脱应该是可以的\,而不是/

所以r.append('\n');还是r.append("\n");会工作的(StringBuilder有重载的方法charString类型)。



2

我创建类似于StringBuidler的原始类,并且可以通过调用方法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

1

您还可以在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."));

0

对于科特林,

StringBuilder().appendln("your text");

尽管这是一个Java问题,但这也是kotlin的第一个Google搜索结果,可能会派上用场。


该问题被标记在“ java”下。无需发布甚至与问题相关的语言都无法解决的解决方案。
chntgomez

@chntgomez我寻找了一种在Kotlin中将换行符追加到StringBuilder的方法,并发现了这一点:-)
Alexander Poleschuk

0

除了KS对创建StringBuilderPlus类并利用ther适配器模式扩展最终类的响应之外,如果您使用泛型并在新的append和appendLine方法中返回StringBuilderPlus对象,则可以利用StringBuilders的许多append方法适用于所有不同类型,同时恢复了将多个附加命令串在一起的功能,如下所示

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();

-2

对于Android,请使用它进行读写!

private void writeToFile(String message) {
        try {
            OutputStream outputStream = openFileOutput("todoList.txt",Context.MODE_PRIVATE);
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
            outputStreamWriter.write(message);
            outputStreamWriter.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private String readFromFile() throws IOException {

        String result = "";
        InputStream inputStream = openFileInput("todoList.txt");

        if (inputStream != null) {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String tempString = "";
            StringBuilder stringBuilder = new StringBuilder();

            while ( (tempString = bufferedReader.readLine()) != null ) {

                stringBuilder.append(tempString);
                stringBuilder.append("\n");
            }
            inputStream.close();
            result = stringBuilder.toString();
        }
        return result;
    }

1
这甚至不是问题的答案
chntgomez
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.