使用 StringBuffer 替换整个长字符串中的子字符串

Use StringBuffer to replace substring throughout a long string

我需要组成一个长字符串(4324 个字符)并且想为此目的使用 StringBuffer。大多数字符串将是空格,但某些部分包含订单详细信息。他们必须出现在某些位置。该字符串将输入会计系统。

我正在用空格 (" ") 初始化字符串并设置长度,在此示例中为 64。

public class BytteTekst {
    public static void main(String[] args) {
        String t1 = "Hej, jeg æder blåbærsyltetøj!";
        String t2 = "foo";

        StringBuffer s = new StringBuffer(" ");
        s.setLength(64);

        System.out.println(t1.length());

        s.replace(0, t1.length(), t1);
        System.out.println(s);

        s.replace(t1.length() + 10, t1.length() + t2.length() + 10, t2);
        System.out.println(s);

        System.out.println(s.length());
    }
}

java BytteTekst 的输出是

29
Hej, jeg æder blåbærsyltetøj!
Hej, jeg æder blåbærsyltetøj!foo
64

当我替换 () 字符串时 foo 它出现在第一个替换 () 之后。我需要一些空格才能得到类似这样的结果:

29
Hej, jeg æder blåbærsyltetøj!
Hej, jeg æder blåbærsyltetøj!          foo
64

我是不是用错了StringBuffer?它是否默默地忽略了我要添加的空格?

问题是

s.setLength(64);

将长度更改为 64,用 [=16=] 个字符填充新的 space:其内容将是:

[' ', '[=11=]', '[=11=]', ... '[=11=]'] (1 space, 63 [=11=]s)

第二次替换后,内容将是:

['H', 'e', 'j', ... 't', 'ø', 'j', '!', '[=12=]' (x10), 'f', 'o', 'o', '[=12=]', ...]

所以那里白色space那里,就是non-printed白色space.

如果您想用 space 填充您的字符串,而不是 '[=17=]',您可以使用普通的 for 循环遍历字符串

for (int i = 0; i < 64; ++i) s.setCharAt(i, ' ');

或 hard-code 一串具有正确长度的 space:

StringBuffer s = new StringBuffer("           "); // Not 64 chars - count carefully!

或者您可以 "simply" 初始化一个 char[] 并填充 spaces:

char[] fill = new char[64];
Arrays.fill(fill, ' ');
StringBuffer s = new StringBuffer(new String(fill));