仅使用JDK6进行Base64解码

25

这个关于JDK 5的问题说,没有为JDK 5提供实现,但是JDK 6应该有一个sun.misc.Base64Decoder

据我所知,JDK 6中并没有提供此类,并且我也没有找到其他类似的类。

那么,JDK 6的情况如何呢?

我知道有许多实现,比如Commons和JBoss,但我们有限制性的第三方库政策,因此我试图避免重复造轮子。


你应该远离sun.misc,它有点奇怪,很少改变,但当它改变时速度非常快。 - bestsss
4个回答

58

Java中有官方的实现(非sun.misc),但这并不是任何人都应该去的地方。

java.util.prefs.AbstractPreferences是具有必要方法的类,可以用于此目的。您需要覆盖put方法。

还有一个更易于使用的方法:

javax.xml.bind.DatatypeConverter它有两个感兴趣的方法:


澄清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 Sauer
3
DatatypeConverter 看起来不错! - Joachim Sauer
@Joachim,关于文档,你错了:),我会编辑答案。 - bestsss
那么parseBase64Binary相当于commons.encoder中的Base64.decodeBase64吗?那太好了(也有点令人困惑)。 - kostja
啊,我现在明白了!文档在“首选项”接口中。关于“AbstractPreferences”的文档没有提到Base 64,这就是我感到困惑的原因。 - Joachim Sauer
+1 是因为它是一个内置的 Base64 编码器/解码器,你自己很难找到! - bobbel

10

Java 5和Java 6之间的情况并没有改变。

很不幸,Java SE平台上没有官方的Base64实现。 @bestsss指出,在Java SE 6中实际上有一个(隐藏得很好)的Base64实现(有关详细信息,请参见他的回答)。

Sun JDK附带了这个类(sun.misc.Base64Decoder),但它没有被指定,不应该使用(特别是因为在其他实现甚至版本中都没有必要存在)。

如果您绝对需要避免使用第三方库(Apache Commons Codec通常提供Base64实现),那么您可能想将BSD(或类似的)许可证版本复制到您的项目中。有一个公共领域实现,这是最简单的许可证方式。


1
感谢您的快速回复。我决定尝试使用BSD许可证下的源代码分发MiGBase64实现。它声称非常快速且占用空间小。 - kostja
2
有官方实现,实际上有两个。 - bestsss
4
Java 没有在合理的位置提供内置的 Base64 编码器/解码器,这完全是荒谬的。 - aroth

7

就像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));

2
使用 sun 包是不被鼓励的 - Buhake Sindi

4

我使用了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
   }

一个合适的解决方案,测试两个解决方案并获得相同的结果,只是为了确保一下;-) - TheGabiRod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接