StringBuilder 每次追加内容时如何换行

6

我正在构建一个验证例程,用于验证内容,并以 StringBuilder 的形式给出警告(对于失败)。例如,在下面的代码中,我正在检查值参数X和Y的下限。

 StringBuilder sb= new StringBuilder();

        if(paramX<10){
            sb.append("paramX cannot be less than 10 ");
        }

        if(paramY<20){
            sb.append("paramY cannot be less than 20 ");
        }

        System.out.println(sb);

输出结果为:paramX不能小于10,paramY不能小于20

但我希望输出结果是每个附加的字符串都在新行上打印。就像下面这样。

paramX cannot be less than 10 

paramY cannot be less than 20

我使用了以下方法来解决问题,但最终发现我一直在重复相同的代码(这不是我的意愿)。
sb.append(System.getProperty("line.separator")); // Add Explicit line separator each time
sb.append("\n");
sb.append("paramX cannot be less than 10 \n");

有没有更简单的方法去做它?

2
你能不能直接在原始的追加末尾加上 \n 呢? - Levenal
1
为什么不用这个?sb.append("xxxx\n"); - mychalvlcek
1
你尝试在第一个 append 中添加 \n 吗?sb.append("paramX 不能小于 10 \n"); - Matt Penna
@vlcekmi3,Matt Penna:如上所述,我想避免手动填充/格式化。 - Dark Knight
@vlcekmi3 这就像编写自己的格式化方法一样,而我想要避免这种情况。顺便说一下,它并没有扩展 StringBuilder。 - Dark Knight
显示剩余4条评论
8个回答

7
如果您不想一遍又一遍地做这件事,那么请编写一个帮助方法:
public void appendString(StringBuilder builder, String value) {
    builder.append(value + System.lineSeparator());
}

然后调用:
if(paramX<10){
    appendString(sb, "paramX cannot be less than 10 ");
}

如果需要更改错误输出格式,则只需维护一个地方即可。

这样可以使您的工作更加高效。

1
System.lineSeparator() - Aquarius Power
1
这个 builder.append(line); builder.append(lineSeparator);builder.append(line + lineSeparator); 更有效率,因为前者不会为每一行创建一个新的字符串对象。 - Doomjunky

6

我想分享一下JDK 8的新特性,我用它来实现同样的结果。 使用StringJoiner,我们可以构造一个由分隔符分隔的字符序列。

StringJoiner formattedString= new StringJoiner("\n"); 
formattedString.add("XXX");
formattedString.add("YYY");
System.out.println(formattedString);  

5

另一个选择是使用Apache Commons StrBuilder,它具有您正在寻找的功能。

StrBuilder.appendLn()


1
现在它已经被弃用了。文档建议使用org.apache.commons.text.StrBuilder代替。 - Ilya Serbis
嗯,你确定吗?看起来并没有被弃用。无论如何,功能是一样的。 - Half_Duplex

4
简单的方法是保留错误列表而不是在处理过程中将它们连接起来,这有助于在逻辑错误和它们的呈现之间保持分离。
可以看一下Spring验证的实现方式:你会发现有一个Errors对象用来维护错误列表,另外还有一个独立的消息源对象,负责为不同的错误填充用户可见的消息。

我的问题是,我正在处理遗留代码。我不想仅仅为了消息格式而触及整个设置。希望你能理解我的痛苦。 - Dark Knight
1
@黑暗骑士:是的,完全明白。 - Nathan Hughes

2
您可以尝试使用PrintStream,因为它有一个println(String string)方法,可以自动添加新行。
像这样:
```java PrintStream ps = new PrintStream(outputStream); ps.println("需要打印的内容"); ```
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(bos);
ps.println("Line 1");
ps.println("Line 2");
ps.flush();
String message = new String(bos.toByteArray());
System.out.println(message);

1

首先,您需要在每个.append()的末尾自己包含换行符(\n):

sb.append("paramX cannot be less than 10 \n");

如果你需要重复使用 换行逻辑,只需将其包装在一个方法中:

public void append(StringBuilder sb, Object value) {
    sb.append(value).append(System.getProperty("line.separator")).append('\n');
}

并像这样使用:

if(paramX < 10){
    append(sb, "paramX cannot be less than 10");
}

-1

直接添加即可...

        if(paramX<10){
            sb.append("paramX cannot be less than 10 \n ");
        }

        if(paramY<20){
            sb.append("paramY cannot be less than 20 \n ");
        }

请阅读上面的帖子。我想避免手动填充。如果我能得到某种解决方法,不需要手动填充行格式,我会非常感激。 - Dark Knight
可能会创建自己的函数,但不能扩展StringBuilder StringBuffer类,因为它们是final类。所以你可以创建自定义函数,但我认为你仍然必须手动使用"\n"。 - subash
是的,你必须手动完成这个操作,或者使用流设置更复杂的东西。Java 的乐趣 :D - Andrew

-1

只需使用\n - 它会在任何地方都起作用。此外,看起来你想有条件地添加一个换行符,如果有两条消息:

StringBuilder sb = new StringBuilder();

if (paramX<10) {
    sb.append("paramX cannot be less than 10 ");
}

if (paramY<20) {
    if (!sb.length() > 0) // only add newline if needed
        sb.append('\n');
    sb.append("paramY cannot be less than 20 ");
}

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