【发布时间】:2016-05-19 23:46:34
【问题描述】:
问题
Java 8 java.util.Base64 MIME 编码器和解码器是替代不受支持的内部 Java API sun.misc.BASE64Encoder 和 sun.misc.BASE64Decoder 的吗? p>
编辑(澄清):直接替换
我的意思是我可以将使用 sun.misc.BASE64Encoder 和 sun.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 implementation (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");
}
}
【问题讨论】:
-
直接替换是什么意思?您只是在谈论编码/解码行为吗?
-
@Cubic:我的意思是直接替换,我可以使用 sun.misc.BASE64Encoder 和 sun.misc.BASE64Decoder 将遗留代码切换到 Java 8 MIME Base64 Encoder/Decoder,用于任何现有的其他客户端代码透明地。情况似乎如此,但我希望有一个权威的参考来证实这一点,或者有一个“证明”证明情况并非如此。
-
是的,您可以将旧代码切换到新的 Java 8 Base64 编码器/解码器。它们将始终产生相同的输出。
-
@Raedwald 我不这么认为。此问答记录了遗留代码使用非官方 Java 内部 API(假定永远不会被任何人使用)
sun.misc.BASE64Encoder和sun.misc.BASE64Decoder时的问题。这个问题/答案是关于将此类遗留代码迁移到官方 Java 8 Base64 API。 answer to which encoder class to use 已经建议使用 Java 8 Base64 API,并没有将您指向那些旧的sun.miscAPI。
标签: java encoding java-8 base64 mime