首页 > 解决方案 > Apache Commons Codec Base64 是 sun.misc.BASE64 的替代品吗?

问题描述

背景

这是我原来的问题Migrating from sun.misc.BASE64 to Java 8 java.util.Base64的后续问题,因为有人建议Apache Commons Codec Base64 API 是迁移使用sun.miscBase64 API的代码的替代品.

问题

是不受支持的内部 Java API的直接org.apache.commons.codec.binary.Base64 替代品吗?sun.misc.BASE64Encodersun.misc.BASE64Decoder

插入式替换意味着两种实现(Apache Commons Codec 和sun.misc)的编码/解码结果是相等的,因此它们可以互换使用。

标签: javabase64encoder

解决方案


Stuart Marks对我最初的问题的完美反例回答明确表明,对于至少一种极端情况,Java 8 java.util.Base64MIME 编码器提供的结果与不受支持的内部 Java API 不同sun.misc.BASE64Encoder

因此,让我们使用Apache Commons Codec library再次检查该边缘情况。

边缘案例测试

对于以下测试,我使用sun.misc.BASE64EncoderOpenJDK 7 和 Apache Commons Codec library 1.14 的实现。

public class StuartMarksBase64EncodingEdgeCaseTestForApacheCommonsCodec {

    public static void main(String[] args) {
        byte[] bytes = new byte[57];
        String enc1 = new sun_misc_jdk7.BASE64Encoder().encode(bytes);
        String enc2 = new String(org.apache.commons.codec.binary.Base64.encodeBase64(bytes));

        System.out.println("enc1 = <" + enc1 + ">");
        System.out.println("enc2 = <" + enc2 + ">");
        System.out.println(enc1.equals(enc2));
    }

}

这将导致输出

enc1 = <AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
>
enc2 = <AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA>
false

结论

鉴于测试输出,我得出结论,Apache Commons Codec Base64 API不是迁移使用Base64 API的代码的直接替代品。sun.misc


推荐阅读