【问题标题】:How to efficiently convert byte array to string如何有效地将字节数组转换为字符串
【发布时间】:2010-12-29 11:00:18
【问题描述】:

我有一个 151 字节的字节数组,通常是一条记录,该记录需要插入到 oracle 数据库中。在 151 字节的数组范围内,从 0 到 1 是记录 id,2 到 3 是参考 id,4 到 9 是日期值。字节数组中的以下数据是日期值。我想把它转换成字符串

byte[] b= {48,48,49,48,48,52};  // when converted to string it becomes 10042. 

new String(b);  // current approach

有什么方法可以有效地将某个范围(Arrays.copyOfRange(b,0,5))的字节数组转换为字符串。

【问题讨论】:

  • @Martjin 我有 527890 字节的文件,我必须读取有 13 条记录的 2048 字节块,每条记录是 151 字节,我们必须提取范围并存储在表列中.;)

标签: java byte


【解决方案1】:
new String(b, 0 ,5);

请参阅API doc 了解更多信息。

【讨论】:

  • @Rekin:不,Suresh 特别不想使用整个字节数组。如果他这样做了,那就简单多了:new String(b)
【解决方案2】:

使用String(bytes[] bytes, int offset, int length) 构造函数:http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#String(byte[], int, int)

new String(b, 0, 5);

【讨论】:

    【解决方案3】:

    如果您需要为记录中的每个区域创建一个字符串,我建议使用子字符串方法:

    byte[] wholeRecord = {0,1,2 .. all record goes here .. 151}
    String wholeString = new String(wholeRecord);
    String id = wholeString.substring(0,1);
    String refId = wholeString.substring(1,3);
    ...
    

    实际偏移量可能因字符串编码而异。

    这种方法的优点是字节数组只复制一次。对substring() 的后续调用将不会创建副本,而只会简单地引用带有偏移量的第一个副本。这样可以节省一些内存和数组复制时间。

    【讨论】:

    • 谢谢。但你说偏移量会有所不同。如何根据偏移量动态执行此操作。
    【解决方案4】:

    这里没有一个答案认为您可能没有使用 ASCII。将字节转换为字符串时,应始终考虑字符集。

    new String(bytes, offset, length, charset);
    

    【讨论】:

    • 这是正确的答案。 (但是,甚至比 ASCII 更糟糕的是,其他重载使用 default 编码,这种编码会随着时间、用户到用户、系统到系统而变化。)
    【解决方案5】:

    这里很棒的方式(效率不高):)

        byte[] b = { 48, 48, 49, 48, 48, 52 };
        ByteArrayInputStream bais = new ByteArrayInputStream(b);
    
        BufferedReader buf = new BufferedReader(new InputStreamReader(bais));
    
        String s = buf.readLine();
        System.out.println(s);
    

    【讨论】:

      猜你喜欢
      • 2013-05-08
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2021-11-11
      相关资源
      最近更新 更多