当前位置: 首页 > 面试题库 >

Java 8 java.util.Base64是否可以替代sun.misc.BASE64?

杜浩壤
2023-03-14
问题内容

Java 8 java.util.Base64MIME编码器和解码器是否可以 _ 替代_ 不支持的内部Java API
sun.misc.BASE64Encodersun.misc.BASE64Decoder

编辑(澄清):通过直接 _ 替换,_
我的意思是我可以使用sun.misc.BASE64Encodersun.misc.BASE64Decoder透明地将任何其他现有客户端代码的Java
8 MIME Base64编码器/解码器切换为旧代码。

我到目前为止的想法以及原因

根据我的调查和快速测试(请参见下面的代码), _ 它应该是直接替代品,_ 因为

  • sun.misc.BASE64Encoder基于其JavaDoc的是 _ RFC1521中*_ _指定的BASE64字符编码器 。该RFC是 MIME 规范的一部分… ***_
  • java.util.Base64基于其JavaDoc _使用 RFC 2045* 表1中指定的“ Base64字母”_进行 MIME 下的 编码和解码操作… *

假设RFC 1521和2045中没有重大变化(我找不到任何变化),并且基于使用Java 8 Base64 MIME编码器/解码器的快速测试,应该可以。

我在寻找什么

  • 权威来源确认或否定“直接替换”点或
  • 一个反例,它显示java.util.Base64与sun.misc.BASE64Encoder OpenJDK Java 8实现(8u40-b25)(BASE64Decoder)行为不同的情况
  • 无论你想回答上面的问题 肯定

以供参考

我的测试代码

public class Base64EncodingDecodingRoundTripTest {

    public static void main(String[] args) throws IOException {
        String test1 = " ~!@#$%^& *()_+=`| }{[]\\;: \"?><,./ ";
        String test2 = test1 + test1;

        encodeDecode(test1);
        encodeDecode(test2);
    }

    static void encodeDecode(final String testInputString) throws IOException {
        sun.misc.BASE64Encoder unsupportedEncoder = new sun.misc.BASE64Encoder();
        sun.misc.BASE64Decoder unsupportedDecoder = new sun.misc.BASE64Decoder();

        Base64.Encoder mimeEncoder = java.util.Base64.getMimeEncoder();
        Base64.Decoder mimeDecoder = java.util.Base64.getMimeDecoder();

        String sunEncoded = unsupportedEncoder.encode(testInputString.getBytes());
        System.out.println("sun.misc encoded: " + sunEncoded);

        String mimeEncoded = mimeEncoder.encodeToString(testInputString.getBytes());
        System.out.println("Java 8 Base64 MIME encoded: " + mimeEncoded);

        byte[] mimeDecoded = mimeDecoder.decode(sunEncoded);
        String mimeDecodedString = new String(mimeDecoded, Charset.forName("UTF-8"));

        byte[] sunDecoded = unsupportedDecoder.decodeBuffer(mimeEncoded); // throws IOException
        String sunDecodedString = new String(sunDecoded, Charset.forName("UTF-8"));

        System.out.println(String.format("sun.misc decoded: %s | Java 8 Base64 decoded:  %s", sunDecodedString, mimeDecodedString));

        System.out.println("Decoded results are both equal: " + Objects.equals(sunDecodedString, mimeDecodedString));
        System.out.println("Mime decoded result is equal to test input string: " + Objects.equals(testInputString, mimeDecodedString));
        System.out.println("\n");
    }
}

问题答案:

这是一个小的测试程序,它说明了编码字符串中的差异:

byte[] bytes = new byte[57];
String enc1 = new sun.misc.BASE64Encoder().encode(bytes);
String enc2 = new String(java.util.Base64.getMimeEncoder().encode(bytes),
                         StandardCharsets.UTF_8);

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

其输出为:

enc1 = <AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
>
enc2 = <AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA>
false

请注意,的编码输出sun.misc.BASE64Encoder末尾有换行符。它并不 总是
附加一个换行符,但是如果编码的字符串的最后一行恰好有76个字符,它就会这样做。(作者java.util.Base64认为这是实现中的一个小错误sun.misc.BASE64Encoder-参见审查主题)。

这看似微不足道,但是如果您有一个依赖于此特定行为的程序,则切换编码器可能会导致输出格式错误。因此,我断定java.util.Base64不是
下降的替代产品sun.misc.BASE64Encoder

当然, 意图java.util.Base64是,它是一个功能上等同,RFC-
符合性,高性能,完全支持和指定的更换这是旨在支持代码迁移远离sun.misc.BASE64Encoder。但是,您在迁移时需要注意一些这样的极端情况。



 类似资料:
  • 问题内容: 我正在制作一个程序,要求至少每秒捕获24个屏幕截图。目前,使用下面的代码,我每94毫秒仅获得1个,因此大约为10毫秒。 我不想使用任何第三方库,因为我试图将其保持尽可能小,但是如果我希望获得显着的性能提升,我会愿意的。我也试图保持该平台独立,但是,如果确实能够显着提高性能,我愿意将其限于Windows。 编辑:我现在也尝试了两种不同的方法;使用在oracles网站上找到的代码段,并在下

  • 问题内容: 假设我有以下示例: 例子一 现在,可能是: 例子二 关键不是实际的代码,而是使用一次以上,两次/三次或三次以上的时间。 上午我更好的性能,明智使用 例如两个 比 例如一个 (也许与解释为什么或者为什么不)? 编辑/注意 我怀疑两个更好。当我不可避免地忘记将事件处理程序添加到事件处理程序时,我有点担心的是在添加代码,而不是无意中引入了一个潜在的难以诊断的错误。那么我应该使用还是为此? 谢

  • 问题内容: 您可以在Python中执行此操作,但是在PHP中可以吗? 例如: 问题答案: 这 有点 晚了,但我只想指出,自PHP 5.3起,实际上有可能在不使用PHP扩展的情况下覆盖内部函数。 诀窍是您可以在名称空间内重新定义内部PHP函数。它基于PHP对函数进行名称解析的方式: 在名称空间(例如A \ B)内部,对不合格函数的调用在运行时解决。解决调用foo()的方法如下: 它从当前名称空间中查

  • 问题内容: 键入密码短语时 每个人都能听到敲击空格键的声音,因此在密码字段中显示空格也很合逻辑。所以我想要一些可以显示的东西 代替 这将使键入更加容易,同时几乎不降低安全性。 更新 更新Riduidel的评论之前请三思。当布鲁斯·施耐尔(Bruce Schneier)写 “是时候以明文形式显示大多数密码了”时 ,那么显示其中的一小部分也必须是正确的。尤其是显示仅通过聆听即可捕获的部分。 问题答案:

  • 问题内容: py2exe是否有替代品? 问题答案: cx_Freeze是跨平台的,并且具有相同的功能,或者您可以使用py2app,它仅在Mac上有效。

  • 问题内容: 对于我的调试需求,还算不错。但是,如果可以的 话 ,它会更酷(并且很有帮助)。这可能吗? 问题答案: 有一个项目将iPython嵌入到标准pdb中,因此您可以执行以下操作: 可通过通常的方式安装。 非常短,因此除了easy_installing之外,您还可以在Python路径上的某个位置创建一个文件,并将以下内容粘贴到该文件中: