Для этого два импорта;
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
Как я могу разрешить эту ошибку?
Та ошибка вызывается Вашей конфигурацией Eclipse. Можно уменьшить его до предупреждения. Лучше все еще , используйте кодер Base64, который не является частью непубличного API. Apache, который палата общин имеет одна , или когда Вы уже находитесь на Java 1.8, затем использует java.util.Base64
.
Перейдите к Окну-> Предпочтения-> Java-> Компилятор-> Ошибка/Предупреждения.
Выбор и Ограниченный API Устаревший. Измените его на предупреждение.
Изменение запрещенный и Препятствовавший Ссылка и изменение это к предупреждению. (или как Ваша потребность.)
Уверенный - просто не используют кодер/декодер Sun base64. Существует много других доступных опций, включая Кодек Apache или этот реализация общественного достояния .
Затем читает , почему Вы не должны использовать солнце.* пакеты .
Java 6 поставлется javax.xml.bind.DatatypeConverter
. Этот класс обеспечивает два статических метода, которые поддерживают то же декодирование & кодирование:
parseBase64Binary() / printBase64Binary()
Обновление: Начиная с Java 8 у нас теперь есть намного лучшее Поддержка Base64.
Использование этому и Вам не будет нужна дополнительная библиотека, как Apache Commons Codec
.
Да, и sun.misc. BASE64Decoder является путем медленнее: 9x медленнее, чем java.xml.bind. DatatypeConverter.parseBase64Binary () и 4x медленнее, чем org.apache.commons.codec.binary. Base64.decodeBase64 (), по крайней мере, для маленькой строки на Java 6 OSX.
Ниже тестовая программа, которую я использовал. С Java 1.6.0_43 на OSX:
john:password = am9objpwYXNzd29yZA==
javax.xml took 373: john:password
apache took 612: john:password
sun took 2215: john:password
Btw это с кодеком свободного городского населения 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);
}
}
}
У меня была эта проблема на jdk1.6.0_37. Это - единственный JDE/JRE в моей системе. Я не знаю, почему, но следующее решил проблему:
Проект-> Свойства-> Путь сборки Java-> Библиотеки
переключатель Switch от Среда выполнения к Alernate JRE. Это выбирает тот же jdk1.6.0_37, но после того, как чистят/создают, ошибка компиляции исчезла.
, Возможно, разъяснение в ответе от поршень (16 марта в 9:00) должен сделать что-то с этим.
Это работает, потому что у Вас есть несколько классов в различных файлах банки. Удаление и передобавление jre lib заставят правильные классы быть первыми. Если Вы хотите фундаментальное решение, удостоверяются, что Вы исключаете файлы банки с теми же классами.
Эта ошибка (или предупреждение в более поздних версиях) происходит, потому что Вы компилируете против Среды выполнения Java. Это обнаруживается как JRE System library [CDC-1.0/Foundation-1.0]
в пути Сборки Вашего проекта Java Eclipse. Такие среды только выставляют стандарт Java API вместо всех классов во времени выполнения. Это означает, что классы, привыкшие к реализация стандарт Java API, не выставляются.
можно предоставить доступ к этим конкретным классам с помощью правил доступа, Вы могли настроить Eclipse для использования JDK непосредственно, или Вы могли отключить ошибку. Вы однако скрыли бы серьезную ошибку как Sun, внутренние классы не должны использоваться (см. ниже для короткого объяснения).
<час> Java содержит Base64
класс в стандартном API начиная с Java 1.8. Посмотрите ниже для примера, как использовать его:
оператор импорта Java 8:
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 Кодек палаты общин или , Гуава должна использоваться.
<час>Sun внутренние классы не должны использоваться . Те классы привыкли к [1 110] реализация Java. У них есть открытые методы позволить инстанцирование от других пакетов. Хорошая среда сборки однако должна защищать Вас от использования их.
Используя внутренние классы может повредить совместимость с будущим временем выполнения Java SE; реализация и местоположение этих классов могут измениться в любое время. Этому нужно сильно препятствовать для отключения ошибки или предупреждения.
Я использую систему Unix.
В проекте затмения-> Свойства-> Компилятор Java-> Ошибки/Предупреждение-> Запрещенный Доступ (правило доступа)-> Поворот это к предупреждать/Игнорировать (Ранее, что это было установлено на Ошибку).
Я знаю, что это - очень Старое сообщение. Так как у нас нет вещи sun.misc в знатоке, мы можем легко использовать
StringUtils.newStringUtf8 (Base64.encodeBase64(encVal)); От org.apache.commons.codec.binary. Base64
Эта ошибка из-за Вас, импортируют ниже двух sun.misc импорта классов. BASE64Encoder; импорт sun.misc. BASE64Decoder;. возможно, Вы используете, кодируют и декодируют той библиотеки как ниже.
new BASE64Encoder().encode(encVal);
newBASE64Decoder().decodeBuffer(encryptedData);
Да вместо sun.misc. BASE64Encoder можно импортировать java.util.Base64
класс. Теперь изменитесь, предыдущие кодируют метод как указано ниже:
encryptedData=Base64.getEncoder().encodeToString(encryptedByteArray);
Теперь изменяют предыдущий метод декодирования как ниже
byte[] base64DecodedData = Base64.getDecoder().decode(base64EncodedData);
Теперь, все сделано, можно сохранить программу и работать. Это будет работать, не показывая ошибки.
Добавьте base64decoder банку и попробуйте этот импорт:
import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;