从字符数组转换字符串时忽略末尾的空字符。

3
我正在使用一个JNI API(无法更改),它返回一个表示字符串的固定大小的字符数组。
我使用 String.valueOf(char []) 将其转换为字符串。
问题在于,我可能会收到像这样的数组 {'a','b','c','\0','\0','\0'}
使用 valueOf() 会保留尾随的 NULL,并导致得到错误的字符串。
有没有一种简单的方法将这样的数组转换为字符串并删除 NULL?

1
那些不是尾随的零。那些是空字符。我已经更正了你问题的标题和正文。 - Basil Bourque
3个回答

6
String s = String.valueOf(bits).trim();

只需修剪字符串,它将清除所有*前导和*尾随的空格。


假设你也同意删除前导空格。 - shmosel
这是我询问的那种技巧。 @shmosel 评论员 ;) 在我的情况下没问题。 - user43968
对于未来的读者:String.trim() 方法会移除所有前导和尾随的字符,包括控制字符,只要它们等于或小于空格(<= 0x20)。 - MC Emperor

2

通常情况下,您会获得一个数组和一个length变量,该变量告诉您从数组中读取多少个字符。如果没有 length 变量,则可以使用循环查找并使用new String(char[], int, int) 构造函数来获取它:


char[] arr = {'a','b','c','\0','\0','\0'};
int len = 0;
do {
  len++;
} while (arr.length > len && arr[len] != '\0');
String s = new String(arr, 0 ,len);
System.out.println(s); // abc

1
你假设它不能以\0开头。并且中间也不会有任何\0 - shmosel
你还假设至少有一个尾随的\0 - shmosel
谢谢,但我是在寻找像@mavriksc一样的技巧,我之前不知道。你的回答对于前导空格很好。 - user43968

-1
我是这样做的:由于null只出现在charArray的末尾,所以我倒序遍历数组并计算它有多少个null。然后,我使用数组长度减去null数量作为for循环中的上限,遍历数组并构建最终字符串,不包括尾随的null。
就像这样:
public String getStringFromBufferedCharArray(char[] cArray) {
    StringBuilder finalString = new StringBuilder();
    int count = 0;
    for (int x = cArray.length - 1; x >= 0; x--) {
        if ((int) cArray[x] == 0) count++;
        else break;
    }

    int end = cArray.length - count;

    for (int x = 0; x < end; x++) {
        finalString.append(cArray[x]);
    }
    return finalString.toString();
}

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