Java 来自未完全填充字符数组的字符串

Java 来自未完全填充字符数组的字符串,java,string,arrays,Java,String,Arrays,显然,下面的代码给出了一个相当奇怪的结果 char[] data = new char[5]; data[0] = 'a'; data[1] = 'b'; data[2] = 'c'; out.println("'" + new String(data) + "'"); “abc□□' 是否有一种从字符数组创建字符串的方法,该方法考虑到整个数组可能不会用字符填充到底 问题原因:当使用该方法时,您会给它一个字符数组来填充,我只能假设它不会被完全填充,除非您幸运地到达流的末尾。所以我想知道如何

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

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

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

是否有一种从字符数组创建字符串的方法,该方法考虑到整个数组可能不会用字符填充到底



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

字符串具有接受字符数组加长度(和偏移量)的构造函数:

假设
数据
中没有嵌入空字符(其中前导空字符被视为嵌入空字符),则解决方案需要定位第一个空字符,以确定
数据
字符
的数量:

int length = 0;
while (length < data.length && 0 != data[length]) length++;
String s = new String(data, 0, length);
int-length=0;
而(length
是,有带偏移量和长度的use字符串

 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;

}
公共静态字符[]getNotMessedUpArray(字符[]messedUp){
int messedUp index=messedUp.length;
对于(int i=0;i如果(messedUp[i],我想不出一种健壮的方法,它不能按如下方式工作:

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

will print
false

假设OP事先知道缺少哪些字符。@Baz,你说edge是什么意思?@hmjd对不起,我是说
ab□C□在这种情况下,您的方法不会消除第一个缺少的字符。@Baz,那么在这种情况下,
字符串
应该是什么样子?如果清除缺少的
字符
,用一个空格替换?这实际上是一个要求吗?@hmjd不要问我,问OP。OP只是说:“整个数组可能不会被填充”。解决方案是否必须处理嵌入的空字符?如果是,行为应该是什么?如果嵌入的意思是与其他字符混合,则不是。这里真正的问题是空字符最初是如何到达的?您是否忽略了前面的读取结果计数?@EJP老实说,我没有想到原因d结果,直到我发布了这个问题,所以这个问题现在对于我的特殊情况来说是没有意义的,但仍然很好奇,当你没有这个计数时,是否有聪明的解决方案:)Reader.read(char[])返回读取的字符数。然后您必须确切地知道已设置的字符数。然后您必须迭代字符串并检查每个字符是否
0x00
不同于
0
?@DuncanJones-应该注意,OP澄清了他的问题,以明确1)无效的c角色总是在末尾,2)他知道最后一个有效角色的位置。
System.out.println(' ' == ((char) 0x00));