对于这两个进口;
import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;
我收到了这个错误:
Access restriction: The type BASE64Decoder is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\rt.jar
如何解决此错误?
答案 0 :(得分:123)
转到窗口 - >首选项 - > Java - >编译器 - >错误/警告。
选择已弃用且受限制的API 。将其更改为警告。
更改禁止和气馁参考并将其更改为警告。 (或根据需要。)
答案 1 :(得分:59)
该错误是由Eclipse配置引起的。您可以将其减少为警告。 Better still,使用不属于非公共API的Base64编码器。 Apache Commons有one,或者当您已经使用Java 1.8时,请使用java.util.Base64
。
答案 2 :(得分:34)
当然 - 只是不要使用Sun base64编码器/解码器。还有很多其他选项,包括Apache Codec或此public domain implementation。
答案 3 :(得分:24)
Java 6发布了javax.xml.bind.DatatypeConverter
。该类提供了两种支持相同解码的静态方法。编码:
parseBase64Binary() / printBase64Binary()
<强>更新强> 从Java 8开始,我们现在有了更好的Base64支持。
使用此功能,您不需要额外的库,例如Apache Commons Codec
。
答案 4 :(得分:5)
Yup和sun.misc.BASE64Decoder比较慢:比java.xml.bind.DatatypeConverter.parseBase64Binary()快9倍,比org.apache.commons.codec.binary.Base64.decodeBase64()慢4倍,at至少对于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
顺便说一句是commons-codec 1.4。 1.7的速度似乎变慢了:
javax.xml took 377: john:password
apache took 1681: john:password
sun took 2197: john:password
未测试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);
}
}
}
答案 5 :(得分:5)
我在jdk1.6.0_37上遇到了这个问题。 这是我系统中唯一的JDE / JRE。我不知道为什么,但以下解决了这个问题:
项目 - &gt;属性 - &gt; Java构建路径 - &gt;库
将单选按钮从执行环境切换为 Alernate JRE 。 这选择了相同的jdk1.6.0_37,但在clean / build之后编译错误消失了。
在 ram (3月16日9:00)的答案中澄清可能需要做些什么。
答案 6 :(得分:3)
发生此错误(或更高版本中的警告)是因为您正在针对Java执行环境进行编译。这在Eclipse Java项目的Build路径中显示为JRE System library [CDC-1.0/Foundation-1.0]
。此类环境仅公开Java标准API,而不是运行时中的所有类。这意味着用于实现 Java标准API的类不会公开。
您可以使用访问规则允许访问这些特定类,您可以将Eclipse配置为直接使用JDK,也可以禁用该错误。然而,您将隐藏一个严重错误Sun internal classes shouldn't be used(请参阅下面的简短说明)。
自Java 1.8以来,Java在标准API中包含Base64
class。请参阅下面的示例如何使用它:
Java 8 import语句:
import java.util.Base64;
Java 8示例代码:
// create a byte array containing data (test)
byte[] binaryData = new byte[] { 0x64, 0x61, 0x74, 0x61 };
// create and configure encoder (using method chaining)
Base64.Encoder base64Encoder = Base64.getEncoder().withoutPadding();
// encode to string (instead of a byte array containing ASCII)
String base64EncodedData = base64Encoder.encodeToString(binaryData);
// decode using a single statement (no reuse of decoder)
// NOTE the decoder won't fail because the padding is missing
byte[] base64DecodedData = Base64.getDecoder().decode(base64EncodedData);
如果Java 8不可用,则应使用Apache Commons Codec或Guava等库。
Sun internal classes shouldn't be used。这些类用于实现 Java。他们有公共方法允许从其他包中实例化。一个良好的构建环境,但应该保护您不使用它们。
使用内部类可能会破坏与未来Java SE运行时的兼容性;这些类的实现和位置可以随时改变。强烈建议不要禁用错误或警告。
答案 7 :(得分:2)
这是有效的,因为您在不同的jar文件中有多个类。删除和重新添加jre lib将使正确的类成为第一个。如果您想要一个基本的解决方案,请确保使用相同的类排除jar文件。
答案 8 :(得分:1)
我正在使用unix系统。
在eclipse项目中 - &gt;属性 - &gt; Java编译器 - &gt;错误/警告 - &gt;禁止访问(访问规则) - &gt;将其转为警告/忽略(以前将其设置为错误)。
答案 9 :(得分:1)
请注意,sun.misc.BASE64Decoder
在JDK-13中不可用
答案 10 :(得分:0)
我知道这是非常老的帖子。因为我们在maven中没有任何东西sun.misc 我们可以轻松使用
StringUtils.newStringUtf8(Base64.encodeBase64(encVal)); 来自org.apache.commons.codec.binary.Base64
答案 11 :(得分:0)
此错误是因为您导入了两个类以下
import sun.misc.BASE64Encoder; import sun.misc.BASE64Decoder;。Maybe you are using encode and decode of that library like below.
new BASE64Encoder().encode(encVal);
newBASE64Decoder().decodeBuffer(encryptedData);
是的,而不是sun.misc.BASE64Encoder,你可以导入 java.util.Base64 class 。现在更改以前的编码方法
encryptedData=Base64.getEncoder().encodeToString(encryptedByteArray);
现在更改以前的解码方法
byte[] base64DecodedData = Base64.getDecoder().decode(base64EncodedData);
现在一切都完成了,你可以保存程序并运行。它会在没有显示任何错误的情况下运行。
答案 12 :(得分:0)
添加base64decoder jar并尝试这些导入:
//Try to replace "yolo" with a float.
System.out.println(String.format("%6.2f", "yolo"));