68 votes

import sun.misc.BASE64Encoder entraîne une erreur lors de la compilation dans Eclipse

Pour cela, deux importations ;

import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;

J'ai obtenu 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 ?

124voto

nIKUNJ Points 2441

Allez dans Fenêtre-->Préférences-->Java-->Compilateur-->Erreur/Avertissements.
Sélectionnez API obsolètes et restreintes . Changez-le en avertissement.
Changement interdit y Découragé Reference et changez-le en warning. (ou selon vos besoins).

0 votes

Le même problème se produit lorsque l'on essaie d'utiliser sun.misc.Signal ces jours-ci également. Répondre à la question actuelle a également résolu mon problème.

2 votes

Cela a peut-être "répondu à la question", mais masquer une erreur sous forme d'avertissement est une mauvaise solution ( mais pas assez pour être déclassé ). @Orism La réponse de l'auteur ci-dessous utilise javax.xml.bind.DatatypeConverter résout le problème sans dépendances supplémentaires lorsque JDK >= 1.6

3 votes

@earcam C'est seulement une erreur à cause d'une configuration par défaut d'Eclipse trop enthousiaste. Le compilateur Java ne considère pas cela comme une erreur et NetBeans non plus.

67voto

EJP Points 113412

Cette erreur est causée par la configuration de votre Eclipse. Vous pouvez la réduire à un avertissement. Encore mieux Utilisez un codeur Base64 qui ne fait pas partie d'une API non publique. Apache Commons a un ou si vous êtes déjà sous Java 1.8, utilisez alors java.util.Base64 .

2 votes

@downvoter Veuillez expliquer, à moins que vous ne vouliez que votre downvote soit pris pour du simple vandalisme de site.

0 votes

Je suppose qu'il a été rétrogradé en faveur des réponses de NIKUNJ ou de Jon Skeeter.

3 votes

@VladimirZhilyaev Ce n'est pas à cela que sert le système de downvote. Il sert expressément à dire "cette réponse n'est pas utile". S'il existe une meilleure réponse, elle devrait certainement être votée par le haut, mais les votes négatifs devraient être appliqués aux réponses incorrectes ou non pertinentes. Il est clair que certaines personnes ont d'autres objectifs.

38voto

Jon Skeet Points 692016

Bien sûr, mais n'utilisez pas l'encodeur/décodeur Sun base64. Il y a beaucoup d'autres options disponibles, notamment Apache Codec ou ceci mise en œuvre dans le domaine public .

Ensuite, lisez Pourquoi ne pas utiliser les paquets sun.* ? .

1 votes

Puisqu'oracle voulait que tout soit marqué oracle lors de la prise de contrôle de Sun, cela aurait été l'occasion parfaite de tout reconditionner et de se débarrasser de cette classe une fois pour toutes !

0 votes

@ThorbjørnRavnAndersen Ils ont fait quelque chose de mieux ; ils ajout d'une classe Base64 dans java.util .

24voto

Orism Points 359

Java 6 fournit le javax.xml.bind.DatatypeConverter . Cette classe fournit deux méthodes statiques qui supportent le même décodage et encodage :

parseBase64Binary() / printBase64Binary()

Mise à jour : Depuis Java 8, nous disposons d'une bien meilleure Base64 Soutien.

Utilisez ceci et vous n'aurez pas besoin d'une bibliothèque supplémentaire, comme Apache Commons Codec .

1 votes

Personnellement, je n'aime pas vraiment cette API et je n'utiliserais pas la base 64 d'une classe liée à XML (elle lie votre code à un composant XML qui n'est peut-être pas nécessaire autrement). Mais Oracle a finalement décidé d'implémenter la base 64 dans le paquet Util en Java 8 donc ce n'est plus nécessaire.

5voto

jamshid Points 151

Oui, et sun.misc.BASE64Decoder est beaucoup plus lent : 9x plus lent que java.xml.bind.DatatypeConverter.parseBase64Binary() et 4x plus lent que org.apache.commons.codec.binary.Base64.decodeBase64(), au moins pour une petite chaîne sur Java 6 OSX.

Voici 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

En fait, c'est avec commons-codec 1.4. Avec la version 1.7, cela semble devenir plus lent :

javax.xml took 377: john:password
apache took    1681: john:password
sun took       2197: john:password

Je n'ai pas testé Java 7 ou d'autres OS.

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);
        }
    }
}

0 votes

Il serait utile de documenter la source des déclarations de vitesse de ce type.

0 votes

Je pense que vous voulez dire javax.xml.bind.DatatypeConverter ; Corrigez-moi si je me trompe, mais vu que vous avez donné cette réponse plutôt qu'un commentaire, je doute que vous le fassiez.

0 votes

Bien sûr, avgvstvs, programme de test et détails de l'environnement ajoutés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X