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 :

problème Encodage ObjectOutputStream linux


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 132
    Points : 68
    Points
    68
    Par défaut problème Encodage ObjectOutputStream linux
    Salut à tous,
    Je vais essayer d'expliquer mon problème simplement.
    J'ai une page web qui upload un fichier txt sur un serveur. Ensuite je lit ce fichier avec un BufferedReader pour le mettre dans un StringBuffer et l'écrire dans un fichier binaire avec l'objet ObjectOutputStream.writeObject();.
    Une fois écris je dois relire ce fichier binaire pour modifier son format (nouveau format de date, etc,),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    this.ois = new ObjectInputStream(new FileInputStream(fichier));
                    StringBuffer strBufferFicEEDB = (StringBuffer)ois.readObject();
    Puis je dois redonner à l'utilisateur ce fichier au format texte.
    Mais le problème c'est que l'encodage de mon fichier n'est plus le même, les accents disparaisse, les tabulations, etc.
    Alors petite précision, ça fonctionne en local sur mon PC Windows, c'est à dire que les caractères ne change pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .04.2008|11111|00000061|12|TOTO|Stéphane
    alors que sur le serveur web Tomcat Linux, les caratères sont modifiés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    11111|00000061|TOTO|St?phane|M|0436|0436|?In

  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,


    Lorsque tu lis/écrit dans un fichier texte, tu dois préciser l'encodage sinon c'est un encodage par défaut qui sera utilisé.

    Pour cela il faut passer par un InputStreamReader...

    a++

  3. #3
    Membre confirmé Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Points : 493
    Points
    493
    Par défaut
    Pour être exact l'encodage de ton fichier n'a pas changé, c'est plutôt que tu l'as manipulé avec un mauvais encoding. Typiquement, si tu utilises les méthodes qui ne prennent pas en compte l'encoding, java utilise celui par défaut de la VM. Sous Unix et Windows, cet encoding n'est pas le même par défaut évidemment (sinon ça serait trop simple )
    Donc attention à l'encoding utilisé de bout en bout, et donc à l'encoding du fichier uploadé que tu dois contraindre pour pouvoir le relire en java.

    Les manipulations binaires n'ont pas d'impact sur le fichier. Le problème doit provenir de la lecture du fichier uploadé dans ton StringBuffer.
    Sinon comme remarque, je ne vois pas l'utilité de sérialiser un StringBuffer sur disque, pourquoi ne pas simplement sauvegarder le texte ?

    [[damned, trop tard]]

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 132
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par djsnipe Voir le message
    Sinon comme remarque, je ne vois pas l'utilité de sérialiser un StringBuffer sur disque, pourquoi ne pas simplement sauvegarder le texte ?
    [[damned, trop tard]]
    Tu as tout à fais raison mais je ne peut pas conserver le fichier texte de base sur le serveur car il s'agit de donné confidentielle.

    Je vais voir du coté du InputStreamReader.

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 132
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,
    Lorsque tu lis/écrit dans un fichier texte, tu dois préciser l'encodage sinon c'est un encodage par défaut qui sera utilisé.

    Pour cela il faut passer par un InputStreamReader...
    a++
    Donc si j'ai bien compris, il faut que j'utilise un OutputStreamWriter pour écrire mon fichier et InputStreamReader pour lire ce fichier ?

  6. #6
    Membre confirmé Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Points : 493
    Points
    493
    Par défaut
    OK je comprend la démarche pour la confidentialité. Toutefois, attention au niveau de confidentialité nécessaire. Désérialiser un StringBuffer n'est pas une tâche difficile pour une personne capable d'intercepter le fichier. Regarde plutôt du côté des API de cryptographie pour obtenir un niveau de sécurisation plus élevé.

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 132
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par djsnipe Voir le message
    OK je comprend la démarche pour la confidentialité. Toutefois, attention au niveau de confidentialité nécessaire. Désérialiser un StringBuffer n'est pas une tâche difficile pour une personne capable d'intercepter le fichier. Regarde plutôt du côté des API de cryptographie pour obtenir un niveau de sécurisation plus élevé.
    Il suffit juste que le fichier ne soir pas lisible comme un fichier texte et c'est le cas en utilisant la méthode writeObject() de l'objectOutputStream.
    Par contre ça me pose certains problèmes d'encodage

  8. #8
    Membre confirmé Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Points : 493
    Points
    493
    Par défaut
    OKI, mais ton problème ne provient pas de la relecture de ton fichier à priori car la sérialisation/désérialisation est assurée par java. Vérifie en débuggant que le contenu de ton StringBuffer est correct (avec les accents) avant sauvegarde.
    Si ton fichier est encodé en Cp1252 (windows), uploadé en binaire sur le serveur, la relecture en java sous forme d'une chaîne de caractère doit être fait en précisant l'encoding Cp1252, sinon java prendra donc l'encoding par défaut de ta VM, UTF-8 par défaut sous Unix si je ne dis pas de bétise.

  9. #9
    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
    Ce n'est pas writeObject() qui pose un problème d'encodage. Sauf erreur cela utilisera toujours de l'UTF8 sur tous les systèmes.


    Ton problème vient bien de la lecture/ecriture du fichier texte.

    • Si les fichiers proviennent d'un poste Windows, ils sont surement encodés en windows-1252 (une variante de l'ISO-8859-1)
    • Tu les lis avec l'encodage par défaut. Sous Windows c'est parfait car tu utilisera windows-1252, Mais sous Linux tu utiliseras de l'utf-8 pour lire un fichier windows-1252...

    Tu as déjà ton problème :
    • Sous Windows cela fonctionne parfaitement puis l'encodage est le même.
    • Sous Linux le texte que tu as chargé en mémoire est déjà corrompu...



    a++

    [edit] grillé
    Pour info Cp1252 == windows-1252

  10. #10
    Membre confirmé Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Points : 493
    Points
    493
    Par défaut
    [edit] grillé
    lol, chacun son tour

  11. #11
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 132
    Points : 68
    Points
    68
    Par défaut
    Re,
    Petite précision, j'utilise la librairie FileUpload de Apache.
    J'ai essayé une autre méthode.
    Au lieu d'enregistrer le fichier texte sur le serveur je récupère les byte[] à l'aide de la classe FileItem.get() de la librairie FileUpload
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://commons.apache.org/fileupload/apidocs/org/apache/commons/fileupload/FileItem.html#get()
    puis j'enregistre le fichier binaire à l'aide de la classe ObjectOutputStream.
    Mais j'ai toujours le même problème, sur mon PC windows c'est bon mais sur le serveur ça me met toujours des caractères bizarre pour les accents, tabulation, etc...
    Je n'ai pas trouvé comment faire fonctionner le InputStreamReader, surement parce que je dois avoir un peu de mal à réfléchir en ce moment.
    Sinon je pourrai utiliser une librairie de cryptage pour crypter mon fichier mais je ne sais pas si cela résoudrais mon problème.

  12. #12
    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
    Citation Envoyé par FabienN Voir le message
    Mais j'ai toujours le même problème, sur mon PC windows c'est bon mais sur le serveur ça me met toujours des caractères bizarre pour les accents, tabulation, etc...
    Tant que tu ne spécifiera pas d'encodage tu auras le même problème...

    Par exemple le caractère é est encodé sur 1 octet en windows-1252, alors qu'il en utilise 2 en utf8...

    a++

  13. #13
    Membre confirmé Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Points : 493
    Points
    493
    Par défaut
    Petite question supplémentaire : comment est fait ton traitement qui relit le fichier ? Car si à l'enregistrement, tu traites le fichier comme un binaire il ne doit plus y avoir de problème.

    Dans ton premier post, tu indiques que tu dois modifier son format pour un format de date avant de le renvoyer au client. C'est donc qu'à partir de ce moment, tu doit construire une représentation sous forme de chaîne de caractère de ce contenu binaire. C'est là qu'il faut spécifier l'encoding.

  14. #14
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 132
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par djsnipe Voir le message
    Petite question supplémentaire : comment est fait ton traitement qui relit le fichier ? Car si à l'enregistrement, tu traites le fichier comme un binaire il ne doit plus y avoir de problème.

    Dans ton premier post, tu indiques que tu dois modifier son format pour un format de date avant de le renvoyer au client. C'est donc qu'à partir de ce moment, tu doit construire une représentation sous forme de chaîne de caractère de ce contenu binaire. C'est là qu'il faut spécifier l'encoding.
    Je fais l'inverse de mon enregistrement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fichier));
    StringBuffer strBufferFic = (StringBuffer)ois.readObject();
    En fet je reçois un fichier texte avec des lignes. Chacune d'elle comporte plusieurs valeurs séparé | et je dois reconstruire ce fichier en inversant les colonnes de place et en modifiant le format de certaines données comme les dates par exemple.

    Pour adiGuba je ne comprend pas ce qu'il faut faire, désolé.

  15. #15
    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
    Citation Envoyé par FabienN Voir le message
    Pour adiGuba je ne comprend pas ce qu'il faut faire, désolé.
    Comment fais-tu pour passer d'un fichier uploadé à un StringBuffer ?


    a++

  16. #16
    Membre confirmé Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Points : 493
    Points
    493
    Par défaut
    Ha oui c'est vrai, tu sérialise le StringBuffer. OK, peux-tu mettre l'extrait de code qui construit le StringBuffer ?

    [edit] grillé

  17. #17
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 132
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par djsnipe Voir le message
    Ha oui c'est vrai, tu sérialise le StringBuffer. OK, peux-tu mettre l'extrait de code qui construit le StringBuffer ?

    [edit] grillé
    C'est la librairie FileUpload qui récupère le flux que j'envoie. Après moi je récupère ce flux avec une fonction qui me retourne ce flux en byte[], puis je déclare une nouvelle String str(byte[]) et enfin je créer mon StringBuffer à partir de ma String
    En clair ça fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String str = new String(item.get());
    StringBuffer strBuff = new StringBuffer(str);
    item est une instance de la classe FileItem de la librairie FileUpload qui récupère le flux. get() me renvoie un tableau de byte

  18. #18
    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
    Citation Envoyé par djsnipe Voir le message
    [edit] grillé
    2 - 1 pour moi

    Citation Envoyé par FabienN Voir le message
    puis je déclare une nouvelle String str(byte[])
    C'est là que tu utilises l'encodage par défaut pour construire ta String. Ton byte[] est en windows-1252 et tu l'interprètes comme de l'utf-8 Boum !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String str = new String(b2, "windows-1252");
    Reste à voir si l'encodage est bien supporté sous ton système...


    a++

  19. #19
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 132
    Points : 68
    Points
    68
    Par défaut
    Je teste ça
    Et pour la lecture du fichier rien ne change ?
    Je fais toujours un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          this.ois = new ObjectInputStream(new FileInputStream(fic));
                    StringBuffer strBufferFic = (StringBuffer)ois.readObject();
                    StringReader strRead = new StringReader(strBufferFic.toString());
                    this.bufReader = new BufferedReader(strRead);
    Merci de votre patience

  20. #20
    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
    Tu n'as pas à utiliser de BufferedReader avec l'ObjectInputStream.
    Seulement pour le lecture du fichier initial (si tu ne passais pas par FileItem).

    a++

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/09/2006, 20h20
  2. Problème d´installation de Linux Mandriva
    Par Pyrhaa_666 dans le forum Matériel
    Réponses: 16
    Dernier message: 24/08/2006, 08h02
  3. [DOM] Problème encodage
    Par spilliaert dans le forum Format d'échange (XML, JSON...)
    Réponses: 19
    Dernier message: 05/06/2006, 16h26
  4. Probléme encodage caractéres spéciaux MYSQL
    Par FoxLeRenard dans le forum Installation
    Réponses: 1
    Dernier message: 20/02/2006, 12h10
  5. Réponses: 1
    Dernier message: 02/02/2006, 23h12

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