import sun.misc.BASE64Encoder导致在Eclipse中编译错误

kar*_*ari 63 java eclipse

对于这两个进口;

import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

Access restriction: The type BASE64Decoder is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\rt.jar
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个错误?

nIK*_*UNJ 123

转到窗口 - >首选项 - > Java - >编译器 - >错误/警告.
选择已弃用和受限制的API.将其更改为警告.
更改禁止气馁参考并将其更改为警告.(或根据您的需要.)

  • @earcam由于过度热情的Eclipse默认配置,这只是一个错误.Java编译器不认为它是错误,NetBeans也不认为. (3认同)
  • 它可能已经"回答了问题",但屏蔽错误作为警告是一个糟糕的解决方案(虽然对于downvote_来说还不够糟糕).[@Orism](http://stackoverflow.com/a/12090601/573057)下面的回答使用`javax.xml.bind.DatatypeConverter`**解决了问题**,没有其他依赖关系,其中JDK> = 1.6 (2认同)

use*_*421 61

该错误是由Eclipse配置引起的.您可以将其减少为警告.更好的是,使用不属于非公共API的Base64编码器.Apache Commons有一个,或者当你已经在Java 1.8上,然后使用java.util.Base64.

  • @VladimirZhilyaev这不是downvote系统的用途.明确地说'这个答案没有用'.如果有更好的答案肯定会被投票,但是downvotes应该应用于不正确或不相关的答案.很明显,有些人有其他议程. (3认同)
  • 低估了这个(抱歉EJP),因为它没有解释*应该如何应用答案或*为什么*首先发生错误. (3认同)
  • @downvoter请解释一下,除非你希望你的downvote被视为纯粹的网站故意破坏. (2认同)
  • 另请注意,此特定导入仅适用于Oracle JVM.其他供应商很可能没有这个类导致您的程序中断. (2认同)

Jon*_*eet 34

当然 - 只是不要使用Sun base64编码器/解码器.还有很多其他选项,包括Apache Codec或这个公共域实现.

然后阅读为什么你不应该使用sun.*包.


Sta*_*cBR 24

Java 6发布了javax.xml.bind.DatatypeConverter.该类提供了两种支持相同解码和编码的静态方法:

parseBase64Binary() / printBase64Binary()

更新: 从Java 8开始,我们现在有了更好的Base64支持.

使用它,你不需要额外的库,比如Apache Commons Codec.


PyD*_*SRS 8

这个错误是因为您正在导入以下两个类 import sun.misc.BASE64Encoder; 导入 sun.misc.BASE64Decoder;。也许您正在使用该库的编码和解码,如下所示。

new BASE64Encoder().encode(encVal);
newBASE64Decoder().decodeBuffer(encryptedData);
Run Code Online (Sandbox Code Playgroud)

是的,您可以导入类,而不是 sun.misc.BASE64Encoder。现在 java.util.Base64更改之前的编码方法,如下所示:

encryptedData=Base64.getEncoder().encodeToString(encryptedByteArray);
Run Code Online (Sandbox Code Playgroud)

现在将之前的解码方法更改如下

byte[] base64DecodedData = Base64.getDecoder().decode(base64EncodedData);
Run Code Online (Sandbox Code Playgroud)

现在一切都完成了,您可以保存程序并运行。它将运行而不会显示任何错误。


jam*_*hid 5

是的,sun.misc.BASE64Decoder比较慢:比java.xml.bind.DatatypeConverter.parseBase64Binary()慢9倍,比org.apache.commons.codec.binary.Base64.decodeBase64()慢4倍,至少对于a Java 6 OSX上的小字符串.

以下是我使用的测试程序.在OSX上使用Java 1.6.0_43:

john:password = am9objpwYXNzd29yZA==
javax.xml took 373: john:password
apache took    612: john:password
sun took       2215: john:password
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这是commons-codec 1.4.随着1.7它似乎变慢:

javax.xml took 377: john:password
apache took    1681: john:password
sun took       2197: john:password
Run Code Online (Sandbox Code Playgroud)

没有测试Java 7或其他操作系统.

import javax.xml.bind.DatatypeConverter;
import org.apache.commons.codec.binary.Base64;
import java.io.IOException;

public class TestBase64 {
    private static volatile String save = null;
    public static void main(String argv[]) {
        String teststr = "john:password";
        String b64 = DatatypeConverter.printBase64Binary(teststr.getBytes());
        System.out.println(teststr + " = " + b64);
        try {
            final int COUNT = 1000000;
            long start;
            start = System.currentTimeMillis();
            for (int i=0; i<COUNT; ++i) {
                save = new String(DatatypeConverter.parseBase64Binary(b64));
            }
            System.out.println("javax.xml took "+(System.currentTimeMillis()-start)+": "+save);
            start = System.currentTimeMillis();
            for (int i=0; i<COUNT; ++i) {
                save = new String(Base64.decodeBase64(b64));
            }
            System.out.println("apache took    "+(System.currentTimeMillis()-start)+": "+save);
            sun.misc.BASE64Decoder dec = new sun.misc.BASE64Decoder();
            start = System.currentTimeMillis();
            for (int i=0; i<COUNT; ++i) {
                save = new String(dec.decodeBuffer(b64));
            }
            System.out.println("sun took       "+(System.currentTimeMillis()-start)+": "+save);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


use*_*016 5

我在jdk1.6.0_37上遇到了这个问题.这是我系统中唯一的JDE/JRE.我不知道为什么,但以下解决了这个问题:

项目 - >属性 - > Java构建路径 - >库

将单选按钮从执行环境切换到Alernate JRE.这选择了相同的jdk1.6.0_37,但在clean/build之后编译错误消失了.

也许从ram(3月16日9:00)回答的澄清 必须做点什么.