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

时间:2010-03-24 15:54:33

标签: java string append concatenation

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

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类已经做了类似的事情而不是我需要在应用程序之间进行一个类就这样我就可以了。做一些如此微不足道的事情。

谢谢!

11 个答案:

答案 0 :(得分:15)

您可以使用StringWriter包裹的PrintWriter

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

答案 1 :(得分:8)

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

以下工作如下:

class DesiredStringThinger {
  StringBuilder text = new StringBuilder();

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

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

答案 2 :(得分:4)

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 :(得分:2)

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

答案 4 :(得分:2)

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

您的代码将类似于

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

其中partsIterable<String>

答案 5 :(得分:1)

您可以使用StringBuffer

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

这不会追加新的换行符,但你也可以为每一行添加它。

答案 6 :(得分:1)

Java SE 8

对于 Java SE 8,可以通过以下几种方式:

  1. 使用String#join
  2. 使用 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

答案 7 :(得分:0)

影响最小的方法可能是添加一个静态方法,用StringBuilder添加新行。

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

@Joachim Sauer打败了我的首选解决方案。对于更复杂的示例,您可能希望使用自己的Writer装饰器,@Rahul G(仅使用私有字段)。

答案 8 :(得分:0)

如果你对表现不感到骄傲,我认为这很干净利落。

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

答案 9 :(得分:0)

这是使用流的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 :(得分:0)

在 Java 8 中你可以这样做

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

文档 here