将byte[]转换为String后调用trim()方法是否正确/高效?

3
假设一个字节数组以很多零结尾。 调用
new String(barray,"UTF-8")

这个函数会给我一个错误长度的字符串,因为0字节会被翻译成\0(这是因为Java不认为字符串像以\0结尾的字符序列)。 这个函数正确吗:

public String convertFromByteArray(byte[] a){
    String s = new String(a,"UTF-8");
    return s.trim();

还有更高效的方式吗?

@BheshGurung Phate在询问效率问题,在您所引用的问题中并没有涉及到这个问题。 - rpax
1
非常好,谢谢!无论如何,我会选择6倍速版本,因为我百分之百确定我的字节字符串中不会有空字节。 - Phate
1个回答

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倍

编辑:

正如@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倍。


非常好!我会在这个地方使用字符集项目代替UTF-8,但我认为这也是最好的。 - Phate
那么,读取两个字节作为一个字符,当有两个连续的\0时返回,这样中间的0的问题可能会得到解决。 - user2889419

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