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

Java 使用StringBuffer替换整个长字符串中的子字符串,java,replace,whitespace,stringbuffer,Java,Replace,Whitespace,Stringbuffer,我需要组成一个长字符串(4324个字符),并希望为此使用StringBuffer。字符串的大部分是空白,但某些部分包含orderdetails。它们必须出现在某些位置。该字符串将被输入会计系统 我用空格(“”)初始化字符串,并将长度设置为64,在本例中为64 public class BytteTekst { public static void main(String[] args) { String t1 = "Hej, jeg æder blåbærsyltetøj

我需要组成一个长字符串(4324个字符),并希望为此使用StringBuffer。字符串的大部分是空白,但某些部分包含orderdetails。它们必须出现在某些位置。该字符串将被输入会计系统

我用空格(“”)初始化字符串,并将长度设置为64,在本例中为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
当我replace()字符串
foo
时,它出现在第一次replace()之后。我需要一些空白来得到类似的结果:

29
Hej, jeg æder blåbærsyltetøj!
Hej, jeg æder blåbærsyltetøj!          foo
64
我是不是用错了StringBuffer?是不是忽略了我想添加的空白?

问题在于

s.setLength(64);
将长度更改为64,用
\0
字符填充新空间:其内容将为:

[' ', '\0', '\0', ... '\0'] (1 space, 63 \0s)
['H', 'e', 'j', ... 't', 'ø', 'j', '!', '\0' (x10), 'f', 'o', 'o', '\0', ...]
第二次更换后,内容将为:

[' ', '\0', '\0', ... '\0'] (1 space, 63 \0s)
['H', 'e', 'j', ... 't', 'ø', 'j', '!', '\0' (x10), 'f', 'o', 'o', '\0', ...]
所以这里有空白,只是没有打印的空白

如果要用空格填充字符串,而不是
'\0'
,则可以使用普通for循环遍历字符串

for (int i = 0; i < 64; ++i) s.setCharAt(i, ' ');
或者,您可以“简单地”使用填充空格的
char[]
进行初始化:

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

另外,您应该使用
StringBuilder
而不是
StringBuffer
。API基本相同,但它避免了不必要的同步。谢谢,我将使用它。它将不会从外部访问,所以我不必担心。谢谢您的详细解释。现在有道理了。