IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Encodage d'un flux en base64


Sujet :

Entrée/Sortie Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 234
    Points : 172
    Points
    172
    Par défaut Encodage d'un flux en base64
    Bonjour,
    j'ai un problème d'encodage : je souhaite transformer un flux en base64. Hors je cherche une API efficace en Java. Seulement la seule que je connais est celle de sun et elle me degrade mes flux (du moins de la facon dont je l'utilise qui est peut-être incorrect !!!)
    voici le code simple qui prend un fichier gif de petite taille et le réécrit dans un autre fichier apres l'avoir convertit dans les deux sens en base64. J'ai besoin de retrouver le meme résultat bien sur et ce n'est pas la cas avec ce code.
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.PrintWriter;
    public class Main {
    	public static void testEncodeDecode() throws IOException{
    		//Encodage
    		FileInputStream fis = new FileInputStream("Coucher de soleil.gif");
    		BufferedInputStream bis = new BufferedInputStream(fis);
    		ByteArrayOutputStream baos = new ByteArrayOutputStream();
     
    		BASE64Encoder be = new BASE64Encoder();
    		//Encodage du flux
    		be.encodeBuffer(bis,baos);	
    		//be.
    		fis.close();
    		bis.close();
     
    		FileOutputStream fos = new FileOutputStream("Soleil.gif");
    		BufferedOutputStream bos = new BufferedOutputStream(fos);
    		PrintWriter pw = new PrintWriter(bos);
    		BASE64Decoder bd = new BASE64Decoder();
    		pw.print(new String(bd.decodeBuffer(baos.toString())));
    		pw.flush();
    		pw.close();
    		fos.close();
    		baos.close();
     
    	}
    	public static void main(String[] args) {
    		testEncodeDecode();
    	}
     
    }
    Est ce quelqu'un aurait une solution/bibliothèque à me proposer (ou bien sur une correction de mon code).

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu utilises un PrintWriter pour écrire la chaine décodé, ce qui est une erreur car cela considère les données comme des caractères et non pas comme des données binaire, d'où l'erreur...

    De plus tu utilises plusieurs couche de Stream que tu ne fermes pas forcément dans le bon ordre (et du coup des données bufférisées peuvent ne pas être écrites).

    Je te conseille d'éviter de multiplier les références en englobant directement les appels de constructeur, et d'utiliser des try/finally pour bien fermer tes flux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    		ByteArrayOutputStream baos = new ByteArrayOutputStream();
     
    		// Encodage
    		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("Coucher de soleil.gif"));
    		try {
    			sun.misc.BASE64Encoder be = new sun.misc.BASE64Encoder();
    			be.encodeBuffer(bis,baos);
    		} finally {
    			bis.close();
    		}
     
     
    		// La chaine encodé en Base64 :
    		String buffer = baos.toString();
     
     
    		// Decodage
    		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("Soleil.gif"));
    		try {
    			sun.misc.BASE64Decoder bd = new sun.misc.BASE64Decoder();
    			bos.write(bd.decodeBuffer(buffer));
    		} finally {
    			bos.close();
    		}

    Enfin, les classes BASE64Encoder et BASE64Decoder du package sun.misc.* ne sont pas documenté et encore moins standard : il est tout à fait possible qu'elles ne soient pas présente dans une JVM ! Ce sont des classes spécifique utilisé par Sun en interne et elle devrait le rester...

    Je te conseille plutôt de te tourner vers une librairie externe pour cela (comme Jakarta Commons Codec par exemple).

    a++

Discussions similaires

  1. Connaître l'encodage d'un flux de données
    Par CliffeCSTL dans le forum Windows
    Réponses: 2
    Dernier message: 29/05/2015, 14h24
  2. [PHP 5.4] Encodage d'un flux
    Par Mogwaii dans le forum Langage
    Réponses: 0
    Dernier message: 12/05/2014, 12h24
  3. Problème encodage PDF de flux à flux
    Par florian.terisse dans le forum Général Java
    Réponses: 4
    Dernier message: 27/11/2012, 15h52
  4. Encodage des pièces jointes d'un mail : toujours base64 ?
    Par Michaël dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 15/10/2005, 12h34
  5. conversion d'un flux xml en base64 ?
    Par jlassira dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 05/07/2005, 22h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo