正如我已经说过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