【问题标题】:How to append a newline to StringBuilder如何将换行符附加到 StringBuilder
【发布时间】:2013-01-26 07:13:35
【问题描述】:

我有一个StringBuilder 对象,

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

现在我想在StringBuilder 后面添加一个换行符。我该怎么做?

result.append("/n"); 

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

【问题讨论】:

标签: java stringbuilder


【解决方案1】:

应该是

r.append("\n");

但我建议您按照以下方式进行操作,

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

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

【讨论】:

  • +1 表示 System.lineSeparator 快捷方式。更大的问题是为什么没有StringBuilder#appendLine() 方法。
  • System.lineSeparator() 文档提到“返回与系统相关的行分隔符字符串。”。这不是独立于平台的。如果您需要编写一个将由底层操作系统使用的字符串,请使用此代码,否则使用'\n'
  • @tuscland - 为什么不一直使用 System.lineSeparator() 呢?为什么默认使用 '\n' 是更好的选择?
  • 不,System.lineSeparator() 应该用于处理不可移植资源(即特定于底层操作系统的资源)。无论您在 Windows (\r\n) 或 Unix (\n) 上运行 Java,它都有不同的值。如果你一直使用System.lineSeparator(),你会因此产生不可移植的文件。
  • 难以置信,appendLine 上还没有 StringBuilder 过载。
【解决方案2】:

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

StrBuilder.appendLn()

从 3.6 版开始,StrBuilder 已被弃用,取而代之的是具有相同功能的 TextStringBuilder

【讨论】:

  • ... 从 Java 8 开始有 StringJoiner,其中 " 用于构造由分隔符分隔的字符序列,并且可以选择以提供的前缀开头并以提供的后缀结尾." 使用 "\n" 作为分隔符会导致换行(最后一行除外)。在内部,它使用 StringBuilder。我假设使用 Google Guava Joiner 可以实现相同的方法。
  • ...现在是deprecated。请使用org.apache.commons.text.TextStringBuilder
  • TextStringBuilder 不在commons-lang3,它在commons-text commons.apache.org/proper/commons-text
【解决方案3】:

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

所以r.append('\n');r.append("\n"); 将起作用(StringBuilder 具有charString 类型的重载方法)。

【讨论】:

    【解决方案4】:

    我创建了类似于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
    

    【讨论】:

      【解决方案5】:

      您可以使用line.seperator 追加新行

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          除了 K.S 响应创建 StringBuilderPlus 类并利用适配器模式扩展 final 类之外,如果您使用泛型并在新的 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();
          

          【讨论】:

            【解决方案8】:

            对于 Kotlin,

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

            虽然这是一个java问题,但这也是Kotlin的第一个google结果,可能会派上用场。

            【讨论】:

            • 问题被标记在“java”下。无需发布甚至与问题相关的语言都没有的解决方案。
            • @chntgomez 我在 Kotlin 中寻找一种将换行符附加到 StringBuilder 的方法,结果发现了这个 :-)
            • 我看到了这个并错过了“这是为 Kotlin 准备的”并在 Java 中进行了尝试。这就是你不这样做的原因。没有帮助。
            猜你喜欢
            • 1970-01-01
            • 2016-04-05
            • 2018-09-22
            • 1970-01-01
            • 2013-09-30
            • 2012-11-23
            • 1970-01-01
            • 2021-07-02
            • 2015-01-30
            相关资源
            最近更新 更多