2011-10-19 15 views
1

我有以下方式將文件轉換爲字節數組,而不是字符串和返回。更有效的方法將文件轉換爲字節數組以字符串並返回

 InputStream is = new FileInputStream(new File("c:/original.png")); 
     String temp = Hex.encodeHexString(IOUtils.toByteArray(is)); 
     System.out.println(temp); 
     byte[] b = Hex.decodeHex(temp .toCharArray()); 
     OutputStream out = new FileOutputStream(new File("c:/copy.png")); 
     IOUtils.write(b, out); 

它工作正常。問題是temp字符串的大小。如果c:/original.png文件是1523KBtemp大小是3046KB。是否有更有效的方式將文件轉換爲不會使文件大小加倍的字符串? (順便說一句我明白爲什麼它是關於大小的兩倍)

另外,我怎麼會去壓縮temp字符串?

至於字符串的原因。它被存儲在只需要字符串的緩存中。該文件實際上傳到Web服務器。一旦上傳即將被下載,它將從緩存而不是數據庫中提取。而且緩存可以通過預測來改善搜索性能,我不希望每次搜索時都調用數據庫。

+3

請您澄清*爲什麼*您需要將二進制數據存儲在'String'中? – NPE

+0

爲什麼你想要它作爲一個字符串?它只是在屏幕上呈現嗎? –

+0

你甚至需要十六進制編碼的字符串嗎?如果不是,則跳過該步驟直接使用字節數組。 – millimoose

回答

3

一種更有效的編碼比己烷爲Base64的,開銷朝向大文件最少約37%的趨向。不幸的是,它沒有標準的庫,但Apache Commons包含一個類來執行此操作。

 String temp = Base64.encodeBase64String(IOUtils.toByteArray(is));    
     byte[] b = Base64.decodeBase64(s); 
+0

Apache公用編解碼器,更加精確。 –

+0

@Mat,兩點:第一 - 如果你編碼/解碼正確,你應該逐字地取回輸入文件 - 不要大50%。其次 - 內存使用量仍然是輸入大小的3倍,因爲字符串字符是16位。我確信可以使用大部分unicode空間的編碼,並將其降至接近1。不過,我找不到一個。 –

相關問題