Pour cela deux importations;
import Sun.misc.BASE64Encoder;
import Sun.misc.BASE64Decoder;
J'ai eu cette erreur:
Access restriction: The type BASE64Decoder is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\rt.jar
Comment puis-je résoudre cette erreur?
Cette erreur est causée par votre configuration Eclipse. Vous pouvez le réduire à un avertissement. Encore mieux , utilisez un encodeur Base64 qui ne fait pas partie d'une API non publique. Apache Commons utilise one , ou lorsque vous utilisez déjà Java 1.8, utilisez Java.util.Base64
.
Allez dans Fenêtre -> Préférences -> Java -> Compilateur -> Erreur/Avertissements.
Sélectionnez API obsolète et restreinte . Changez-le en warning.
Modifier interdit et Déconseillé Référence et remplacez-le par warning. (ou selon vos besoins.)
Bien sûr, n'utilisez pas l'encodeur/décodeur Sun base64. Il existe de nombreuses autres options disponibles, notamment Apache Codec ou this implémentation du domaine public .
Ensuite, lisez pourquoi vous ne devriez pas utiliser les packages Sun. * .
Java 6 expédie le javax.xml.bind.DatatypeConverter
. Cette classe fournit deux méthodes statiques prenant en charge les mêmes décodages et encodages:
parseBase64Binary() / printBase64Binary()
Mise à jour: Depuis Java 8, nous avons maintenant un meilleur support Base64 .
Utilisez ceci et vous n’avez pas besoin d’une bibliothèque supplémentaire, comme Apache Commons Codec
.
Oui, et Sun.misc.BASE64Decoder est beaucoup plus lent: 9 fois plus lent que Java.xml.bind.DatatypeConverter.parseBase64Binary () et 4x plus lent que org.Apache.commons.codec.binary.Base64.decodeBase64 (), au moins pour petite chaîne sur Java 6 OSX.
Ci-dessous, le programme de test que j'ai utilisé. Avec Java 1.6.0_43 sur OSX:
john:password = am9objpwYXNzd29yZA==
javax.xml took 373: john:password
Apache took 612: john:password
Sun took 2215: john:password
Btw c'est avec commons-codec 1.4. Avec 1.7, cela semble devenir plus lent:
javax.xml took 377: john:password
Apache took 1681: john:password
Sun took 2197: john:password
N'a pas testé Java 7 ou un autre système d'exploitation.
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);
}
}
}
J'ai eu ce problème sur jdk1.6.0_37 . C'est le seul JDE/JRE sur mon système. Je ne sais pas pourquoi, mais ce qui suit a résolu le problème:
Projet -> Propriétés -> Chemin de construction Java -> Bibliothèques
Basculez le bouton radio de Environnement d'exécution à Alernate JRE . Ceci sélectionne le même jdk1.6.0_37, mais l’erreur de compilation disparaît après nettoyage/compilation.
Peut-être que la clarification de ram (le 16 mars à 9 heures) doit faire quelque chose avec cela.
Cette erreur (ou cet avertissement dans les versions ultérieures) se produit car vous compilez avec un environnement d'exécution Java. Ceci apparaît sous la forme JRE System library [CDC-1.0/Foundation-1.0]
dans le chemin de génération de votre projet Java Eclipse. De tels environnements n'exposent que l'API standard Java au lieu de toutes les classes du runtime. Cela signifie que les classes utilisées pour implémenter l'API standard Java ne sont pas exposées.
Vous pouvez autoriser l'accès à ces classes particulières à l'aide de règles d'accès, configurer Eclipse pour utiliser directement le JDK ou désactiver l'erreur. Cependant, vous cachez une erreur grave car les classes internes de Sun ne doivent pas être utilisées (voir ci-dessous pour une brève explication).
Java contient un Base64
class dans l'API standard depuis Java 1.8. Voir ci-dessous pour un exemple d'utilisation:
Déclaration d'importation Java 8:
import Java.util.Base64;
Exemple de code 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);
Si Java 8 n'est pas disponible, une bibliothèque telle que Apache Commons Codec ou Guava doit être utilisée.
Les classes internes de Sun ne doivent pas être utilisées . Ces classes sont utilisées pour implémenter Java. Ils ont des méthodes publiques pour permettre l'instanciation à partir d'autres packages. Un bon environnement de construction cependant devrait vous empêcher de les utiliser.
L'utilisation de classes internes peut rompre la compatibilité avec les environnements d'exécution Java SE futurs. l'implémentation et l'emplacement de ces classes peuvent changer à tout moment. Il est fortement déconseillé de désactiver l'erreur ou l'avertissement.
Cela fonctionne parce que vous avez plusieurs classes dans différents fichiers JAR. En supprimant et en rajoutant jre lib, les bonnes classes seront les premières. Si vous voulez une solution fondamentale, assurez-vous d’exclure les fichiers jar avec les mêmes classes.
J'utilise un système Unix.
Dans le projet Eclipse -> Propriétés -> Compilateur Java -> Erreurs/Avertissement -> Accès interdit (règle d'accès) -> Tournez-le sur avertissement/Ignorer (il était auparavant défini sur Erreur).
Cette erreur est due au fait que vous importez ci-dessous deux classes Import Sun.misc.BASE64Encoder; importer Sun.misc.BASE64Decoder; .Maybe you are using encode and decode of that library like below.
new BASE64Encoder().encode(encVal);
newBASE64Decoder().decodeBuffer(encryptedData);
Ouais, au lieu de Sun.misc.BASE64Encoder, vous pouvez importer Classe Java.util.Base64 . Modifiez maintenant la méthode de codage précédente comme ci-dessous
encryptedData=Base64.getEncoder().encodeToString(encryptedByteArray);
Maintenant changez la méthode de décodage précédente comme ci-dessous
byte[] base64DecodedData = Base64.getDecoder().decode(base64EncodedData);
Maintenant que tout est terminé, vous pouvez enregistrer votre programme et le lancer. Il fonctionnera sans montrer aucune erreur.
Je sais que c'est très vieux post. Puisque nous n’avons rien de Sun.misc in maven .__, nous pouvons facilement utiliser
StringUtils.newStringUtf8 (Base64.encodeBase64 (encVal)); ;__. De org.Apache.commons.codec.binary.Base64
Ajoutez le fichier jar base64decoder et essayez les importations suivantes:
import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;