假设一个以很多零结尾的字节数组。 电话
new String(barray,"UTF-8")
会给我一个长度错误的字符串,因为0字节将转换为\ 0(这个cuz java不会考虑字符串,如字符序列由\ 0定义)。 这个功能是否正确:
public String convertFromByteArray(byte[] a){
String s = new String(a,"UTF-8");
return s.trim();
或者有更有效的方法吗?
答案 0 :(得分:4)
是的。
public static void main(String[] args) {
byte[] barray= new byte[99999999];
barray[0]=72;
barray[1]=101;
barray[2]=108;
barray[3]=108;
barray[4]=111;
barray[5]=33;
for (int k = 6; k < barray.length; k++) {
barray[k]=0;
}
try {
long a=System.nanoTime();
convertFromByteArray(barray);
long b=System.nanoTime();
long tot_1=b-a;
long c=System.nanoTime();
convertFromByteArray2(barray);
long d=System.nanoTime();
long tot_2=d-c;
System.out.println(tot_1 +" - "+tot_2+" "+(tot_1*1.0/tot_2));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static String convertFromByteArray(byte[] a) throws UnsupportedEncodingException{
String s = new String(a,"UTF-8");
return s.trim();
}
public static String convertFromByteArray2(byte[] barray) throws UnsupportedEncodingException {
int i=0;
while(barray[i++]!=0);
return new String(barray,0,i-1,"UTF-8");
}
输出:
426205180 - 69702 6114.676479871453
快6k x
修改强>
当@SotiriosDelimanolis和@BheshGurung注意到,如果有一个字节0后跟一个有效的字符,则该解决方案不正确。
为了涵盖所有案件,
public static String convertFromByteArray2(byte[] barray) throws UnsupportedEncodingException {
int i=barray.length-1;
while(barray[i--]==0 && i>=0);
return new String(barray,0,i+2,"UTF-8");
}
进行测试
快3倍。