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 :

Modification de charset à la volée.


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut Modification de charset à la volée.
    Bonjour,

    j'ai une application utilisant actuellement un BufferedReader avec un charset par défaut. Je voudrais pouvoir modifier à la volée le charset employé, alors que le flux fonctionne encore.

    Apparemment, ce genre de code (de lecteur) foire assez bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // L'exemple est avec un fichier, mais l'application fonctionnera
    avec des flux de toutes sortes : fichiers, sockets, ...
    InputStream is = new FileInputStream("test.txt") ; 
    BufferedReader br1 = new BufferedReader(
            new InputStreamReader(is, MON_ANCIEN_CHARSET)
        );
    br1.readLine();
    BufferedReader br2 = new BufferedReader(
            new InputStreamReader(is, MON_NOUVEAU_CHARSET)
        );
    br2.readLine();
    J'obtiens d'abord bien la première ligne (ici d'une dizaine de caractères). Ensuite, j'obtiens la fin de la ligne contenant le 8.193e caractère (8ko étant +/- la taille du buffer employé, selon mes estimations).

    Pour un écrivain, c'est plus facile et ça marche, à condition de flusher après chaque écriture.

    Et en prime, si c'était possible de me dire comment faire la même chose avec les NIO, ça serait le panard.

    D'avance, merci

    Olivier

  2. #2
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    En faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BufferedReader br2 = new BufferedReader(
            new InputStreamReader(br1, MON_NOUVEAU_CHARSET)
        );
    Ca devrait mieux marcher ?
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Non : la classe InputStreamReader n'accepte que des InputStream comme entrée, pas de Reader. Et BufferedReader est un Reader. Il n'y a pas d'équivalent à un InputStreamReader inversé.

    J'ai la nette impression que je vais devoir implémenter ma propre version de InputStreamReader, permettant de gérer le changement de charset.

  4. #4
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Mille excuses ! je voulais dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BufferedReader br2 = new BufferedReader( br1, MON_NOUVEAU_CHARSET );
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Ce n'est pas possible non plus : seul le InputStreamReader joue avec les charsets. Le BufferedReader n'a que deux constructeurs : (Reader) et (Reader, int size).

    C'est logique, puisque les Reader renvoient des char[] à partir de char[] (sauf ISReader) et les InputStream renvoient des int[] à partir de int[].

    Dans la java.io.*, je n'ai rien vu approchant votre raisonnement. Je me lance donc dans ma propre implémentation, en espérant ne pas trop m'emmêler les pinceaux.

  6. #6
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bon, ça m'apprendra à écrire sans tester.

    Ton problème vient du fait que le BufferedReader remplit son Buffer dès qu'il le peut.

    Tu peux peut-être utiliser une PushBackInputStream de la manière suivante :
    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
    25
    26
    27
    28
    29
    30
    byte[] buffer = new byte[512]; // à toi de voir la taille
    String charset1, charset2, str;
    StringBuilder text;
    PushBackInputStream in;
    int index;
     
    text = new StringBuilder();
    do {
      text.append(str);
      in.read(buffer, 0, buffer.size);
      str = new String(buffer, charset1);
      index = str.indexOf("\n");
    } while ( index == -1);
     
    index ++; // ça sert à inclure le \n dans le premier charset
    text.append(str.substring(0, index));
     
    //on récupère la fin du tableau dans le second charset
    in.unread(buffer, index, buffer.size - index);
    str = new String(buffer, index, buffer.size - index, charset2);
    text.append(str);
     
    // on lit tout le reste sous le second charset
    while(in.available != 0) {
      in.read(buffer, 0, buffer.size);
      str = new String(buffer, charset2);
      text.append(str);
    }
     
    System.out.println(text.toString());
    Je n'ai toujours pas testé , mais ça peut te donner des idées.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

Discussions similaires

  1. Désérialisation et modification de classe à la volée
    Par mtranchant dans le forum Général Java
    Réponses: 3
    Dernier message: 02/02/2012, 11h55
  2. Modification de classe à la volée
    Par crazymonkey dans le forum Général Python
    Réponses: 7
    Dernier message: 25/11/2009, 13h58
  3. Changement du charset à la volée
    Par dingoth dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 21/01/2008, 17h01
  4. [ACCESS]modification du charset utilisé par access
    Par Philoulheinz dans le forum ASP
    Réponses: 2
    Dernier message: 22/11/2006, 22h37
  5. modification des pages à la volée
    Par bertil dans le forum Apache
    Réponses: 2
    Dernier message: 28/06/2006, 15h34

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