显然,以下代码给出了一个相当奇怪的结果。
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)
结合使用,这使我的问题没有实际意义。但是,仍然是我很好奇的东西,而不是我通过谷歌搜索找到的东西,所以我想这个问题在这里得到答案是好的;)
答案 0 :(得分:1)
String
有构造函数String(char[] value, int offset, int count),它接受char
加上长度(和偏移量)的数组:
String s = new String(data, 0, 3);
假设在data
中没有嵌入的空字符(前导空字符被认为是嵌入的空字符),解决方案需要找到第一个空字符以确定char
的数量{ {1}}:
data
答案 1 :(得分: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
。
答案 2 :(得分:0)
是的,使用带有偏移量和长度的字符串constructor。
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;
}