在byte []到String转换后调用trim()是正确/有效的吗?

时间:2014-03-16 18:37:11

标签: java

假设一个以很多零结尾的字节数组。 电话

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

或者有更有效的方法吗?

1 个答案:

答案 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");
}

使用http://ideone.com/mg2U23

进行测试

快3倍。