今天在Android上测试压缩和解压缩。 获得压缩后的byte[]数组后,直接用 byte[].toString()方法取得字符串。
然后用这个字符串再反向来解压缩,还原数据。却发现还原回来的字符串有误。
String str = "这是一个用于测试的字符串"; try { /* * 压缩 */ ByteArrayOutputStream out = new ByteArrayOutputStream(); ZipOutputStream zout = new ZipOutputStream(out); zout.putNextEntry(new ZipEntry("0")); zout.write(str.getBytes()); zout.closeEntry(); byte[] compressed = out.toByteArray(); // 返回压缩后的字符串的字节数组 Log.d(TAG,"compressed String" + compressed.toString()); /* * 解压 */ ByteArrayOutputStream rout = new ByteArrayOutputStream(); ByteArrayInputStream in = new ByteArrayInputStream(compressed); ZipInputStream zin = new ZipInputStream(in); zin.getNextEntry(); byte[] buffer = new byte[1024]; int offset = -1; while ((offset = zin.read(buffer)) != -1) { rout.write(buffer, 0, offset); } byte[] uncompressed = rout.toByteArray(); // 返回解压缩后的字符串的字节数组 Log.d(TAG,"uncompressed String" + uncompressed.toString()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
打出的不是字符串数据,而是类签名:
compressed String[B@42eabfb8
uncompressed String[B@42eaeb90
byte[]字节数组的toString()获得的字符串,和使用new String(byte[]) 构造一个新的字符串。得出的结果不同。
Java对象都继承于Object,Object中提供了toString方法,用于简单返回该类的类签名。在Java中,数组也可以看作是一种对象,显然byte[]也是一种继承与Object的对象,并且它没有重写Object的toString方法,因此使用byte[]的toString返回的字符串,仅仅是byte[]的类签名,而不是对应的值。
改为使用new String()构造方法,将byte[]转换为字符串,得到的就会是一个根据字节数组内容构造的字符串。
Log.d(TAG,"compressed String" + new String(compressed)); Log.d(TAG,"uncompressed String" + new String(uncompressed));
输出:
compressed StringPKԀ�F0$��这是一个用于测试的字符串P�j��)$
uncompressed String这是一个用于测试的字符串