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

Langage Java Discussion :

Replace et OutputStream


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 72
    Par défaut Replace et OutputStream
    bonjour

    Je cherche à remplacer une sous chaine dans une chaine typiquement utiliser la méthode replace de String. Et là le bas blesse !!

    1/ Je n"oublie pas que les chaines sont immuables don je fais bien
    String s = ma_string.replace("TOTO", "TATA");

    Je lis donc un fichier ligne par ligne et je remplace dans les lignes les TOTO par TATA. Qd je sors en System.out je vois bien la chaine modifiée mais lorsque j'écris cette chaine dans un OutputStream, rien n'est modifié ?

    Bug de cette méthode ? Bug dans l'OutputStream ? Bug de moi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    BufferReader input = new BufferReader(New InputStreamReader(new FileInputStream(mon_fichier)));
    DataOutputStream dos = new DataOutputStream(new FileOutputStream(mon_output)));
     
    String line = null;
    While ((line=input.readLine()) != null) {
          String tmp = line.replace("TOTO", "TATA");
          dos.writeBytes(tmp);
          dos.flush();
    }
     
    input.close();
    dos.close();

  2. #2
    Membre éprouvé
    Homme Profil pro
    Thésard BioInformatique
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Thésard BioInformatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Par défaut
    Il ne serait pas plus simple de remplacer toutes tes occurrences de ton fichier avec un replaceAll() par exemple. Et ensuite, écrire ton fichier.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 72
    Par défaut
    J'ai essayé aussi le replaceAll et ca donne le même résultat !!!

    ps : pour info je suis en 5.0

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par chrime71 Voir le message
    bBug de cette méthode ? Bug dans l'OutputStream ? Bug de moi ?
    En gras l'explication la plus probable.

    Possibilités de choses qui peuvent causer ça :
    - Il n'y a pas de TATA dans le fichier de départ, c'est donc assez normal qu'il n'y ait pas de modification.
    - Au lieu de TATA, c'est un truc avec caractères spéciaux que tu cherches à remplacer, et tu ne gères pas correctement l'encodage du fichier lu. Ce qui fait la même chose que le point précédent.
    - Le fichier lu et le fichier écrit sont un seul et même fichier. Dans ce cas-là les résultats sont imprévisibles (mais bon c'est étrange quand même).
    - En fait ce n'est pas TOTO et TATA que tu cherches à remplacer, et un hasard monumental fait que ce que tu cherches à remplacer n'est pas correctement géré par writeBytes() (qui ne gère que les caractères iso-8859-1.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 72
    Par défaut
    Alors

    1/ Il y a bien TATA, qd je fais un System.out de mon programme je vois bien la ligne lue et la ligne transformée !!

    2/ j'écris les données dans une fichier temporaire donc pas de lecture écriture dans un même fichier ce qui me parait déjà improbable à faire ...

    3/ A la base mon fichier est en UTF-16

    Je veux bien buguer mais tout de même

  6. #6
    Membre éprouvé
    Homme Profil pro
    Thésard BioInformatique
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Thésard BioInformatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Par défaut
    Pour éviter tout conflit, j'aurai extrait le texte de mon document dans un String par exemple pour faire un replaceAll().
    Puis dans une second temps, j'aurai ré-écris le fichier.


    Essaie déjà ça, car autant ça vient d'un conflit qui ne saute pas aux yeux.

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    D'abord, utilise un Writer et non pas un Dataoutputstream. Dataoutputstream c'est pour du formatage de données, par pour des fichiers textuels.
    Ensuite, si ton fichier est en utf-16, tu dois l'indiquer quand tu crée le Reader. La, t'es parti pour avoir non pas "TATA" dans ta String mais "T A T A " parce que, au mieux, t'es occupé de lire en utf-8. Pareil quand tu crée le writer, précise l'encodage.

    Enfin, tu dis que "ca marche en System.out", mais je ne vois pas là dedans le code qui utilise System.out en parallèle pour te permettre de controler

  8. #8
    Membre éprouvé
    Homme Profil pro
    Thésard BioInformatique
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Thésard BioInformatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(mon_fichier)));
    StringBuffer txt = new StringBuffer();
    String line = null;
    while ((line=input.readLine()) != null) {
    	String tmp = line.replace("TOTO", "TATA");
    	txt.append(tmp);
    }
     
    input.close();
     
    DataOutputStream dos = new DataOutputStream(new FileOutputStream(mon_output));
    dos.writeBytes(txt.toString());
    dos.close();
    Ce code marche. Il faudra juste penser à remettre les sauts de ligne. Mais tout marche.

    Je ne connais pas ton problème, mais il est peut-être nécessaire de tout mettre en majuscule dans ta chaîne, pour ne pas loupé un "toto" par exemple.

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 72
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    D'abord, utilise un Writer et non pas un Dataoutputstream. Dataoutputstream c'est pour du formatage de données, par pour des fichiers textuels.
    Ensuite, si ton fichier est en utf-16, tu dois l'indiquer quand tu crée le Reader. La, t'es parti pour avoir non pas "TATA" dans ta String mais "T A T A " parce que, au mieux, t'es occupé de lire en utf-8. Pareil quand tu crée le writer, précise l'encodage.

    Enfin, tu dis que "ca marche en System.out", mais je ne vois pas là dedans le code qui utilise System.out en parallèle pour te permettre de controler
    Et un grand merci à Tchize .. le Writer est efficace (avec l'utf-16 de précisé pour l'input) ..

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par chrime71 Voir le message
    2/ j'écris les données dans une fichier temporaire donc pas de lecture écriture dans un même fichier ce qui me parait déjà improbable à faire ...
    Cela dépend des environnements. Mais le résultat est en effet aléatoire.

    Citation Envoyé par chrime71 Voir le message
    3/ A la base mon fichier est en UTF-16
    Bon ben voilà. Il y a aucune chance que InputStreamReader devine qu'il doit lire en UTF-16. Du coup il voit des caractères séparés de caractères nuls.

    Il faut indiquer que c'est de l'utf-16 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new InputStreamReader(new FileInputStream(mon_fichier), "utf-16")
    ou si c'est du little-endian sans BOM :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new InputStreamReader(new FileInputStream(mon_fichier), "utf-16LE")
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 72
    Par défaut
    J'ai essayé en précisant utf-16 et ca ne changeait pas gd chose !!

    Pour mon System.out qui n'est pas dans mon code, je ne l'ai pas mis mais sinon cela fonctionne.

    Concernant TOTO et TATA ce ne sont que des exemples bateau pour mon problème mes strings à remplacer sont moins simples que cela

    Je vais tenter le Writer pour voir si ca change qque chose !!

  12. #12
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par chrime71 Voir le message
    J'ai essayé en précisant utf-16 et ca ne changeait pas gd chose !!
    Si. Les problèmes que tu rencontrais ensuite étaient complètement différents.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ODBC] Fonction Replace en ODBC
    Par Alexandre T dans le forum Access
    Réponses: 4
    Dernier message: 10/01/2007, 11h02
  2. [C#] Methode Replace
    Par pc152 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 22/05/2004, 17h17
  3. Transformer un OutputStream en un InputStream
    Par glRaZ dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 29/04/2004, 11h10
  4. Prob d'execution de REPLACE *** INTO
    Par Mystman dans le forum Langage SQL
    Réponses: 6
    Dernier message: 26/04/2004, 16h41
  5. Cherche Fonction du style replace...
    Par sdchamplas dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/03/2003, 13h54

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