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這是一個用於測試的字符串

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM