这个关于JDK 5的问题说,没有为JDK 5提供实现,但是JDK 6应该有一个sun.misc.Base64Decoder
。
据我所知,JDK 6中并没有提供此类,并且我也没有找到其他类似的类。
那么,JDK 6的情况如何呢?
我知道有许多实现,比如Commons和JBoss,但我们有限制性的第三方库政策,因此我试图避免重复造轮子。
这个关于JDK 5的问题说,没有为JDK 5提供实现,但是JDK 6应该有一个sun.misc.Base64Decoder
。
据我所知,JDK 6中并没有提供此类,并且我也没有找到其他类似的类。
那么,JDK 6的情况如何呢?
我知道有许多实现,比如Commons和JBoss,但我们有限制性的第三方库政策,因此我试图避免重复造轮子。
Java中有官方的实现(非sun.misc
),但这并不是任何人都应该去的地方。
java.util.prefs.AbstractPreferences
是具有必要方法的类,可以用于此目的。您需要覆盖put
方法。
还有一个更易于使用的方法:
javax.xml.bind.DatatypeConverter
它有两个感兴趣的方法:
public static byte[] parseBase64Binary( String lexicalXSDBase64Binary )
public static String printBase64Binary( byte[] val )
澄清AbstractPreferences的base64性质:java.util.prefs.Preferences
/** * 将表示指定字节数组的字符串与此首选项节点中的指定键相关联。 * 关联的字符串是字节数组的 Base64 编码,如RFC 2045第6.8节中定义的那样, * 其中有一个小变化:字符串仅由 Base64 字母表中的字符组成; 它不会包含任何换行符。 * 请注意,字节数组的最大长度限制为MAX_VALUE_LENGTH的四分之三,以便Base64编码的字符串长度不超过MAX_VALUE_LENGTH。 * 此方法旨在与{@link# getByteArray}一起使用。 */ public abstract void putByteArray(String key, byte[] value);
AbstractPreferences
以符合文档要求?它的 JavaDoc 中没有提到 Base64。 - Joachim SauerDatatypeConverter
看起来不错! - Joachim SauerJava 5和Java 6之间的情况并没有改变。
很不幸,Java SE平台上没有官方的Base64实现。 @bestsss指出,在Java SE 6中实际上有一个(隐藏得很好)的Base64实现(有关详细信息,请参见他的回答)。
Sun JDK附带了这个类(sun.misc.Base64Decoder
),但它没有被指定,不应该使用(特别是因为在其他实现甚至版本中都没有必要存在)。
如果您绝对需要避免使用第三方库(Apache Commons Codec通常提供Base64实现),那么您可能想将BSD(或类似的)许可证版本复制到您的项目中。有一个公共领域实现,这是最简单的许可证方式。
就像Joachim Sauer在之前的评论中所说,JDK1.6已经捆绑了自己的Base64实现(sun.misc.*),这里有一个例子:
String toEncode = "Encoding and Decoding in Base64 Test";
//Encoding in b64
String encoded = new BASE64Encoder().encode(toEncode.getBytes());
System.out.println(encoded);
//Decoding in b64
byte[] decodeResult = new BASE64Decoder().decodeBuffer(encoded);
System.out.println(new String(decodeResult));
我使用了byte[] decodedValue = DatatypeConverter.parseBase64Binary(value);
这个网站讲得很清楚: https://www.rgagnon.com/javadetails/java-0598.html
选自该网站的内容:
public static String encode(String value) throws Exception {
return DatatypeConverter.printBase64Binary
(value.getBytes(StandardCharsets.UTF_8)); // use "utf-8" if java 6
}
public static String decode(String value) throws Exception {
byte[] decodedValue = DatatypeConverter.parseBase64Binary(value);
return new String(decodedValue, StandardCharsets.UTF_8); // use "utf-8" if java 6
}