3

显然,下面的代码给出了一个相当奇怪的结果。

char[] data = new char[5];
data[0] = 'a';
data[1] = 'b';
data[2] = 'c';

out.println("'" + new String(data) + "'");

'abc□□'

有没有办法从字符数组创建一个字符串,考虑到整个数组可能没有被字符填充到末尾?


问题的原因:当使用该Reader.read(char[])方法时,你给它一个字符数组来填充,我只能假设它不会被完全填充,除非你很幸运,当你到达流的末尾时。所以想知道如何将其转换为可以附加到StringBuffer. 现在意识到虽然该read方法实际上返回了读取的字节数,但我假设它可以与 结合使用StringBuffer.append(char[], int, int),这使得我的问题没有实际意义。但是,仍然是我很好奇的东西,而不是我通过谷歌搜索找到的东西,所以我想这个问题很高兴在这里得到答案;)

4

3 回答 3

1

Stringhas 构造函数String (char[] value, int offset, int count)接受一个加长char(和偏移)的数组:

String s = new String(data, 0, 3);

假设解决方案中没有嵌入的空字符(前导空字符被认为是嵌入的空字符),data则需要找到第一个空字符以确定 in 的char数量data

int length = 0;
while (length < data.length && 0 != data[length]) length++;
String s = new String(data, 0, length);
于 2012-10-05T12:22:11.007 回答
1

我想不出一个不起作用的健壮方法如下:

char[] data = new char[5];
data[0] = 'a';
data[1] = 'b';
data[2] = 'c';

StringBuilder builder = new StringBuilder();
for (char c : data) {
  if (c != 0x00) {
    builder.append(c);
  }
}

System.out.println(builder.toString());

这专门省略了值等于默认值 ( 0x00) 的字符。请注意,这远非完美,因为0x00它是合法的字符。我建议您重新评估导致您达到这一点的设计决策。

我不喜欢假设((char) 0x00)是空白并且可以修剪的解决方案。即使它有效。注意:

System.out.println(' ' == ((char) 0x00));

将打印false

于 2012-10-05T12:29:11.447 回答
0

是的,有使用带有偏移量和长度的字符串构造函数。

 String(char[] value, int offset, int count) 

 new String(data,0,3) 

现在,如果不知道确切的值,那么您可以编写实用程序方法来更正数组。或用于trim()修剪尾随字符。

 public static char[] getNotMessedUpArray(char[] messedUp) {

    int messedUpIndex = messedUp.length;
    for (int i = 0; i < messedUp.length; i++) {
        if (messedUp[i] <= ' ') {
            System.arraycopy(messedUp, i + 1, messedUp, i, messedUp.length
                    - i - 1);
        }
    }
    for (int i = 0; i < messedUp.length; i++) {
        if (messedUp[i] <= ' ') {
            messedUpIndex--;
        }
    }
    char[] notMessedUp = new char[messedUpIndex];
    System.arraycopy(messedUp, 0, notMessedUp, 0, messedUpIndex);
    return notMessedUp;

}
于 2012-10-05T12:23:06.827 回答