有没有一种简单的方法可以将多行文本连接成一个字符串,而无需不断添加换行符?

Posted

技术标签:

【中文标题】有没有一种简单的方法可以将多行文本连接成一个字符串,而无需不断添加换行符?【英文标题】:Is there an easy way to concatenate several lines of text into a string without constantly appending a newline? 【发布时间】:2011-01-31 08:06:15 【问题描述】:

所以我基本上需要这样做:

String text = "line1\n";
text += "line2\n";
text += "line3\n";
useString( text );

涉及的内容更多,但这是基本思想。有没有什么可以让我在这方面做更多的事情?

DesiredStringThinger text = new DesiredStringThinger();
text.append( "line1" );
text.append( "line2" );
text.append( "line3" );
useString( text.toString() );

显然,它不需要完全那样工作,但我想我明白了基本观点。总是可以选择编写一个自己处理文本的循环,但是如果那里有一个标准的 Java 类已经做了类似的事情,而不是我需要在应用程序之间携带一个类,这样我就可以了做些微不足道的事。

谢谢!

【问题讨论】:

【参考方案1】:

AFAIK 没有库类允许您这样做。

下面的工作虽然可以:

class DesiredStringThinger 
  StringBuilder text = new StringBuilder();

  public void append(String s)  text.append(s).append("\n"); 

  @Override
  public String toString()  return text.toString(); 

【讨论】:

StringBuffer 是同步的,但是我“性能问题”?不。非竞争锁获取速度很快。事实上,在后来的 JVM 中,不必要的锁无论如何都会被优化掉。但我想你也没有理由更喜欢 StringBuffer…… 这个解决方案很优雅。我喜欢使用委托来创建包装器。 @Tomislav:我不明白为什么这个解决方案的性能应该特别差。 我确信 Rahul 的初始串联代码类似于 text += line;,但查看答案历史记录,我似乎弄错了。抱歉,拉胡尔。 @Tomislav:你是对的。首先,我发布了一个快速而肮脏的text += line; 解决方案,并在另外2-3 分钟内将其更改为StringBuffer 替代方案(在我看到你的评论之前)。也许这就是为什么原始帖子没有出现在编辑历史中的原因。然后我在 Zwei 的建议下将其更改为StringBuilder。对于我造成的所有混乱,我深表歉意。 :(【参考方案2】:
public String createString () 
   StringBuilder sb = new StringBuilder ();
   String txt = appendLine("firstline", sb).appendLine("2ndLine", sb).toString();


private StringBuilder appendLine (String line, StringBuilder sb) 
   String lsp = System.getProperty("line.separator");
   return sb.append (line).append (lsp);

【讨论】:

【参考方案3】:

你可以使用 StringBuffer

StringBuffer text = new StringBuffer();
text.append("line1");  
text.append("line2");  
...  
useString(text.toString());   

这不会附加换行符,但您当然也可以为每一行附加它。

【讨论】:

我认为 Marshmellow1328 在调用 append() 时希望在每个标记之间换行 这实际上是我开始的地方。然后我厌倦了为每一行添加换行符。虽然我可以很容易地创建一个小的帮助函数来完成它,但我希望那里可能已经存在一些东西,而不必扩展我的基本 java 库。【参考方案4】:

您可以使用 StringWriter 包裹在 PrintWriter 中:

StringWriter stringWriter = new StringWriter();
PrintWriter writer = new PrintWriter(stringWriter, true);
writer.println("line1");
writer.println("line2");
writer.println("line3");
useString(stringWriter.toString());

【讨论】:

【参考方案5】:

也许影响最小的方法是添加一个静态方法以将新行追加到StringBuilder

 public static StringBuilder appendln(StringBuilder buff, String str) 
     return buff.append(str).append('\n');
 

但是@Joachim Sauer 比我更喜欢我的解决方案。对于更复杂的示例,您可能需要使用自己的 Writer 装饰器,如 @Rahul G(仅使用私有字段)。

【讨论】:

【参考方案6】:

如果你对性能不感兴趣,我认为这是干净整洁的。

class DesiredStringThinger 
  StringBuilder sb = new StringBuilder();

  public void concat(String... s)  
      for(String str : s)
         sb.append(s).append("\n");
      
  

  @Override
  public String toString()  
      return sb.toString();
  

【讨论】:

【参考方案7】:

您可以使用来自Apache Commons 的 StringUtils.join 帮助器。它允许从列表中构建一个字符串。您可以添加“分隔符”字符/字符串。

【讨论】:

【参考方案8】:

如果您愿意使用外部库,请查看 Guava 中的 Joiner。

您的代码将类似于

String result = Joiner.on("\n").join(parts);

其中partsIterable<String>

【讨论】:

【参考方案9】:

这是一个使用流的 Java 8 解决方案:

public class DesiredStringThinger 

    private List<String> items = new ArrayList<>();

    public void append(String s) 
        items.add(s);
    

    @Override
    public String toString() 
        return items.stream().collect(Collectors.joining("\n", "", "\n"));
    


【讨论】:

【参考方案10】:

在 java 8 中你可以做到这一点

String[] lines = new String[]"line1", "line2", "line3";
String s = String.join("\n", lines);

文档here

【讨论】:

【参考方案11】:

Java SE 8

使用 Java SE 8,可以通过以下几种其他方式:

    使用String#join 使用Stream

演示:

import java.util.Arrays;
import java.util.stream.Collectors;

public class Main 
    public static void main(String[] args) 
        String[] arr =  "line1", "line2", "line3" ;

        // Using String#join
        System.out.println(String.join(System.lineSeparator(), arr));

        System.out.println();

        // Using Stream
        System.out.println(Arrays.stream(arr).collect(Collectors.joining(System.lineSeparator())));
    

输出:

line1
line2
line3

line1
line2
line3

【讨论】:

这可能是基于 stl 和输出示例的最干净的解决方案。如果您使用动态 ArrayList 而不是 StringArray,也可以使用。

以上是关于有没有一种简单的方法可以将多行文本连接成一个字符串,而无需不断添加换行符?的主要内容,如果未能解决你的问题,请参考以下文章

如何将多行中的文本连接成SQL服务器中的单个文本字符串String?

Python多行输入

SQL将多行左连接成一行

使用 case 语句将多行连接成一列

从元素中分离多行文本

Linux下使用xargs将多行文本转换成一行并用tr实现逗号隔开