问题在Java中膨胀byte []?

时间:2011-01-06 15:22:16

标签: java windows linux byte inflate

我遇到了一个我无法弄清楚的问题。以下是问题的定义: 我在Db2 / Linux环境中的Blob列中有一些数据。在使用JDK压缩压缩byte []之后将Blob写入DB2(在Linux环境中运行此代码的代码)。 我正在尝试编写一个简单的程序来读取一些这样的数据解压缩它(使用JDK)并从Windows环境(我的开发环境)中的解压缩字节数组创建一个String。问题是在解压缩Blob(byte [])之后,解压缩的字节数组的长度通常比预期长1-3个字节。我的意思是,偏移和长度字段也存储在数据库中。因此在这种情况下,解压缩的字节数组的长度通常比数据库中存储的长度长,只需几个字节。因此,如果我从解压缩的字节数组创建一个String对象并使用子串(offset,length)方法使用数据库中的offset和length字段创建另一个String对象,我的第二个String(我使用substring方法获得的那个)是短。

一个例子是: 数据库记录包含一个blob,偏移量:0,长度:260,409 解压缩blob后 -

 compressedByte[].length  - 71,212
 decompressedByte[].length   - 260,412
 new String(decompressByte[]).length()  - 260,412
 new String(decompressByte[]).subString(0, 260,409).length() - 260409

对于其他一些输入记录,我看到的差异是长度在1-3个字节之间。

我对这个问题感到困惑,并想知道是否有人可以提出任何建议,以便我可以做更多的调试来解决这个问题。我想知道这是否与某些方式有关,如何在Linux环境中存储/写入字节以及如何在Windows中读取它们?谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

我怀疑两个系统之间的默认编码是不同的。

// on the linux box   
byte [] blob = str.getBytes("UTF-8");

// in your code 
String str = new String(blob, "UTF-8");

或者至少找出linux盒子上的默认编码是(普通UTF-8)并跳过步骤1.

Joel on software

在{{3}}

上发生了一个非常好的例子

答案 1 :(得分:2)

String不是字节的一般持有者。毫无疑问,db2 / Linux环境和Windows环境之间会有不同的默认字符编码,这会导致字节和字符之间的来回转换不同。