正如我已經說過elsewhere,在Java中,String
是文本,byte[]
是二進制數據。
字符串≠字節[]
文本≠二進制數據
的圖像是二進制數據。 Base64是一種允許通過兼容US_ASCII的文本通道傳輸二進制數據的編碼(對於ASCII文本的超集有一個類似的編碼:Quoted Printable)。
因此,它是這樣:
Image (binary data) → Image (text, Base64 encoded binary data) → Image (binary data)
,你會用String encodeBase64String(byte[])
編碼,並byte[] decode(String)
解碼。這些是Base64的唯一理智的API,byte[] encodeBase64(byte[])
是誤導性的,結果是US_ASCII兼容的文本(所以,一個String
,而不是byte[]
)。
現在,文本具有一個字符集和編碼,String
內部使用一個固定的Unicode/UTF-16字符集/編碼組合,你必須從/轉換的東西時,爲String
,顯式指定字符集/編碼,或者隱式地使用平臺的默認編碼(這是PrintStream.println()
所做的)。 Base64文本是純粹的US_ASCII,所以你需要使用它,或US_ASCII的超集。 org.apache.commons.codec.binary.Base64
使用UTF8,這是US_ASCII的超集,所以一切都很好。 (OTOH,內部java.util.prefs.Base64
使用平臺的默認編碼,所以我猜如果你用UTF-16編碼啓動你的JVM,它會中斷)。
返回主題:您已嘗試將解碼圖像(二進制數據)作爲文本打印出來,這顯然不起作用。 PrintStream
有write()
方法可以寫入二進制數據,所以你可以使用這些,你會得到相同的垃圾,就像你寫了原始圖像。使用FileOutputStream
會更好,並將生成的文件與原始圖像文件進行比較。
class'Base64'來自哪裏(這不是標準的Java API類)? – Jesper
@jesper:我正在使用apache commons(org.apache.commons.codec.binary.Base64) – Ankit
下面的nos已經回答了你的問題。只是一個小小的評論:當將字符串轉換爲字節[]和反之亦然時,最好明確指定編碼,而不要依賴平臺設置。我的意思是它應該是「新字符串(b,」UTF-8「)」和「ab.getBytes(」UTF-8「)」 – Tarlog