zoukankan      html  css  js  c++  java
  • byte[] 的toString() 和 new String(byte[]) 的区别

    今天在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这是一个用于测试的字符串
  • 相关阅读:
    JavaScript和Applet通信
    HashTable和HashMap的区别
    JAVA中有关byte,int,long这些基本数据类型的存储方式以及负数在JAVA中的表示方式
    浏览带有最新JAVA技术的Applet
    JAVA byte[], int, long三者之间的相互转换代码
    使用正则表达式将JSP中文本标签抽取出来填到PropertyFile中
    JAVA多线程-继承Thread类和实现Runnable接口的区别
    Java Conditional Compile Java条件编译
    Alexa 网站排名
    AJAX 教程
  • 原文地址:https://www.cnblogs.com/maxiaodoubao/p/4683147.html
Copyright © 2011-2022 走看看