Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2314 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  probleme ecriture fichier

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

probleme ecriture fichier

n°915868
kungouf
Posté le 06-12-2004 à 15:37:15  profilanswer
 

bonjour,
 
j'ai un souci d'ecriture de fichier dans mon programme java
j'ai une structure de donnee a parcourir et a reecrire dans un fichier (il s'agit d'XML en l'occurrence)
 
j'ai un souci en sortie car je n'obtiens pas le resultat voulu, voici le code:
 
public void ecritureFichier(){
     System.out.println("sauvegarde dans un fichier" );
     
     try {
       
      sortie.flush();
      sortie.writeObject("<?xml version=\"1.0\" ?>\n" );
         sortie.writeObject("<!--fichier genere par SYNOXML V-1.0 -->\n" );
         sortie.writeObject("<Services xmlns=\"http://www.hp.com/OV/opcsvc\">\n" );
         
         //Insertion du client
         sortie.writeObject("<Service couche=\"client\">\n" );
         sortie.writeObject("     <Label></Label>\n" );
         sortie.writeObject("     <Icon></Icon>\n" );
         sortie.writeObject("     <Name>"+nomClient+"</Name>\n" );
         //insertion des fils du client - aka application
         sortie.writeObject("     <Source>\n" );
         sortie.writeObject("          <Composition />\n" );
         sortie.writeObject("          <ServiceRef>"+nomApplication+"</ServiceRef>\n" );
         
         sortie.writeObject("     </Source>\n" );
         sortie.writeObject("</Service>\n" );
         
         //Insertion de l'application
         sortie.writeObject("<Service couche=\"application\">\n" );
         sortie.writeObject("     <Label></Label>\n" );
         sortie.writeObject("     <Icon></Icon>\n" );
         sortie.writeObject("     <Name>"+nomApplication+"</Name>\n" );
         
         //insertion des fils de l'application - aka les sous applications
         
            for(int i=0; i<tabSousApplication.size(); i++){
             
              System.out.println(((SousApplication)tabSousApplication.get(i)).nomssAppli);
               
              sortie.writeObject(" <Source>\n" );
              sortie.writeObject("  <Composition />\n" );

              sortie.writeObject("  <ServiceRef>"+((SousApplication)tabSousApplication.get(i)).nomssAppli+"</ServiceRef>\n" );
           

              sortie.writeObject(" </Source>\n" );[#0e00f0/]
            }
 
 
[#0e00f0]sortie.writeObject("</Service>\n" );

             
 
            sortie.writeObject("</Services>\n" );
            sortie.writeObject("<!--  end of file -->\n" );
     }  
     catch ( IOException e ) {
            JOptionPane.showMessageDialog( this,
                    "Erreur d’ouverture de fichier", "Erreur",
                    JOptionPane.ERROR_MESSAGE );
        }      
     
    }
 
 
et voici ce que j'ai en sortie dans mon fichier:
 
-<?xml version="1.0" ?>
<Services xmlns="http://www.hp.com/OV/opcsvc">
 
<Service couche="client">
<Label></Label>
<Icon></Icon>
     <Name>la poste</Name>
     <Source>
          <Composition />
          <ServiceRef>partages</ServiceRef>
    </Source>
</Service>
 
<Service couche="application">
     <Name>partages</Name>
         <ServiceRef>partagev0</ServiceRef>
 
         <ServiceRef>partagev1</ServiceRef>
 
</Services>
<!--  end of file -->
 
 
bon ici c'est bien concatene, mais chaque ligne est precedee de caracteres non voulu...je ne vois pas d'ou ca viens
 
ensuite, quand je veux ecrire le bloc concernant l'application, j'ai le resultat de la boucle qui affiche les fils (partagev0 et partagev1) cependant:
- les tags precedants la boucle, <Source> et <Composition /> n'apparaissent pas
- les tags succedant a la boucle </Source> et </Service> n'apparaissent pas, mais le tag suivant (donc apres la boucle)  </Services>
ainsi que la derniere ligne <-- end of file --> apparaissent???
 
j'ai egalement utilise les methodes writeChars et writeUTF sans succes
je pense que le probleme viens de la boucle mais je ne fait rien de special et ne comprend pas le resultat  
 
quelq'un sait - il d'ou cela proviens?
merci


Message édité par kungouf le 06-12-2004 à 16:04:05
mood
Publicité
Posté le 06-12-2004 à 15:37:15  profilanswer
 

n°915925
fb@alphalo​g
Posté le 06-12-2004 à 16:27:55  profilanswer
 

remplace writeObject par write  
writeObject est utilie pour ecrire des objets , et ajoutes des information pour pouvoir les restaurer
write ecrit le texte brut

n°915934
kungouf
Posté le 06-12-2004 à 16:32:30  profilanswer
 

la methode write n'existe pas dans l'api.
j'ai deja essayer les methodes de bases suivantes:
writeChars
writeBytes
writeUTF
 
sans meilleur resultat

n°915954
LeMicky
Posté le 06-12-2004 à 16:45:01  profilanswer
 

Hé bien, il faudrait qu'on sache un peu ce qu'est ton objet "sortie"...
Ensuite, je ne saurais trop te conseiller de passer par un objet DOM (ensuite, faut chercher, je ne retrouve pas là, mais tu dois pouvoir écrire ton DOM dans le fichier direct) pour être sûr de créer un XML correct.

n°915964
benou
Posté le 06-12-2004 à 16:53:53  profilanswer
 

j'ai un gros doute sur le coup de la boucle qui écrit pas ce qu'on lui demande.  
 
Essaye d'isoler le problême  un peu mieux le problême ... parce que là j'ai pas l'impression que ton source correspond à ce qui est executé ...
 
ensuite, vérifies comment tu construis ou obtiens ton flux de sortie, parce que  c'est pas normal d'écrire du texte dans un ObjectOutputStream. Tu devrais plutot avoir un Writer ...

n°915966
LeMicky
Posté le 06-12-2004 à 16:55:32  profilanswer
 

J'ai retrouvé :
 

Citation :


import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
 
 
public static boolean writeXmlDocument(Document document, OutputStream outputstream)
    {
        try
        {
            TransformerFactory transformerfactory = TransformerFactory.newInstance();
            Transformer transformer = transformerfactory.newTransformer();
            transformer.setOutputProperty("method", "xml" );
            transformer.setOutputProperty("indent", "yes" );
            DOMSource domsource = new DOMSource(document);
            StreamResult streamresult = new StreamResult(outputstream);
            transformer.transform(domsource, streamresult);
            outputstream.flush();
         }
        catch(Exception exception)
        {
            System.out.println(exception.toString());
        }
     }

n°915990
kungouf
Posté le 06-12-2004 à 17:09:55  profilanswer
 

j'ecrit dans un FileOutputStream
:
sortie = new ObjectOutputStream(
                         new FileOutputStream( nomDeFichier ) );
 
 
sinon mon source correspond a mon probleme, meme si le coup des tags qui ne s'affichent pas malgre le traitement m'ont un peu etonnes
 
apres les methodes writeObject utilises dans la boucle, j'ai utilise WriteChars, et par miracle ca s'affiche
 
maintenant pourquoi cela fonctionne en utilisant 2 methodes differentes et surtout utiliser la seconde apres le for ca m'etonne un peu
mais ca marche
 
je pense pas avoir un probleme ailleurs, car c'est cette methode qui est appelee dans le programme a l'execution, et rien d'autre.
 
sinon je suis bien partant pour parser le xml avec dom, mais j'ai deja impementer ma structure de donnee, et la phase finale qui est aborde ici est l'ecriture dans le fichier donc ca ne va pas prendre tellement longtemps.
 
sinon je serais interesse par l'autre methode, avez vous un bon tutorial sur dom? (ou plutot jdom)
j'ai essayer de trouver un bon tuto mais probleme c'est qu'il ya enormement de tutoriaux et de parser.
j'ai laisse tomber et code quelque chose de tres specifique a mon appli, mais pourquoi pas evoluer vers un jdom par la suite
 

n°916015
LeMicky
Posté le 06-12-2004 à 17:21:57  profilanswer
 

Pourquoi tu passes par un ObjectOutputStream???? C'est pourtant simple tu utilises un objet qui n'est pas fait pour faire ce que tu veux faire....
passe réllement par un FileOutputStream:
FileOutputStream sortie=new FileOutputStream( nomDeFichier );
....
 
Enfin bref, relis le post...
 
Ensuite, pour le DOM, regarde la javadoc de import org.w3c.dom.Document; (ça devrait te suffir, ou sinon une recherche sur le web rapide permet d'avoir plein d'exemples de codes)
 
ex:
javax.xml.parsers.DocumentBuilderFactory dbifc = javax.xml.parsers.DocumentBuilderFactory.newInstance();
  javax.xml.parsers.DocumentBuilder builder = dbifc.newDocumentBuilder();
  xmlDoc=builder.newDocument();
  elt=xmlDoc.createElement("xmlDocQuiVaBien" );
  xmlDoc.appendChild(elt);
  elt.setAttribute("idForm",idForm);
  elt.setAttribute("idGed",idGed);
  elt.setAttribute("idFolder",idFolder);
....
 

n°916026
kungouf
Posté le 06-12-2004 à 17:25:27  profilanswer
 

LeMicky a écrit :

J'ai retrouvé :
 

Citation :


import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
 
 
public static boolean writeXmlDocument(Document document, OutputStream outputstream)
    {
        try
        {
            TransformerFactory transformerfactory = TransformerFactory.newInstance();
            Transformer transformer = transformerfactory.newTransformer();
            transformer.setOutputProperty("method", "xml" );
            transformer.setOutputProperty("indent", "yes" );
            DOMSource domsource = new DOMSource(document);
            StreamResult streamresult = new StreamResult(outputstream);
            transformer.transform(domsource, streamresult);
            outputstream.flush();
         }
        catch(Exception exception)
        {
            System.out.println(exception.toString());
        }
     }




 
j'ai essaye de passer par un parser dom cependant beaucoup de classes ne sont pas reconnus
quelles sont les imports necessaires?
des rajouts de classes eventuellements?

n°916044
LeMicky
Posté le 06-12-2004 à 17:29:24  profilanswer
 

heu... :heink:  j'ai justement mis les import dans le code exemple.
Tu es en jdk combien?

mood
Publicité
Posté le 06-12-2004 à 17:29:24  profilanswer
 

n°916065
benou
Posté le 06-12-2004 à 17:36:28  profilanswer
 

LeMicky a écrit :


passe réllement par un FileOutputStream:
FileOutputStream sortie=new FileOutputStream( nomDeFichier );


par un writer c'est mieux, j'insiste ;)
 
Writer sortie = new FileWriter( nomDeFichier );

n°916079
LeMicky
Posté le 06-12-2004 à 17:42:13  profilanswer
 

benou a écrit :

par un writer c'est mieux, j'insiste ;)
 
Writer sortie = new FileWriter( nomDeFichier );


 
Ok, si tu veux un Writer mais un Fileqqchose pas un Objectqqchose!! (C'était surtout sur ça que moi j'insistais).
 
D'ailleurs, c'est quoi l'avantage de passer par un FileWriter / à un FileOutputStream? C'est plus optimisé?
 
EDIT : bon j'ai regardé la javadoc (et oui, y a pas mieux ;) ), effectivement, le FileOutputStream c'est pour les bytes et le FileWriter c'est pour les charactères/texte (d'ailleurs ça permet d'encoder en même temps si tu passes un charset spécifique, sympa :) )


Message édité par LeMicky le 06-12-2004 à 17:46:09
n°916087
kungouf
Posté le 06-12-2004 à 17:46:49  profilanswer
 

LeMicky a écrit :

Pourquoi tu passes par un ObjectOutputStream???? C'est pourtant simple tu utilises un objet qui n'est pas fait pour faire ce que tu veux faire....
passe réllement par un FileOutputStream:
FileOutputStream sortie=new FileOutputStream( nomDeFichier );
....
 
Enfin bref, relis le post...
 
Ensuite, pour le DOM, regarde la javadoc de import org.w3c.dom.Document; (ça devrait te suffir, ou sinon une recherche sur le web rapide permet d'avoir plein d'exemples de codes)
 
ex:
javax.xml.parsers.DocumentBuilderFactory dbifc = javax.xml.parsers.DocumentBuilderFactory.newInstance();
  javax.xml.parsers.DocumentBuilder builder = dbifc.newDocumentBuilder();
  xmlDoc=builder.newDocument();
  elt=xmlDoc.createElement("xmlDocQuiVaBien" );
  xmlDoc.appendChild(elt);
  elt.setAttribute("idForm",idForm);
  elt.setAttribute("idGed",idGed);
  elt.setAttribute("idFolder",idFolder);
....


 
merci LeMicky, je suis passe par un ObjectOutputStream parce que le tutorial de sun passait pas la excuse moi de suivre le tuto et de debuter en java ;)
 
http://java.sun.com/docs/books/tut [...] izing.html
 
effectivement j'ai plus aucun probleme avec un println et un FileOutputStream tout simple
 
je fini mon progm et apres je penserais a un evolution vers du dom demain si tout va bien


Message édité par kungouf le 06-12-2004 à 17:48:04
n°916095
benou
Posté le 06-12-2004 à 17:51:39  profilanswer
 

LeMicky a écrit :

D'ailleurs, c'est quoi l'avantage de passer par un FileWriter / à un FileOutputStream? C'est plus optimisé?


non.
C'est une histoire d'encoding. Un Writer te permet d'écrire des caractères (donc des chaines) sans te souscier du charset, c'est à dire de la façon dont un caractère est écrit sous forme de bits. C'est de la responsabilité du writer.
 
pour illustrer, regarde la classe OutputStreamWriter : elle permet de passer d'un outputstream à un writer en indicant l'encoding à utiliser
 
D'ailleurs, comment veux-tu utiliser un OutputStream pour écrire une chaine ? en faisant des write(taChaine.getBytes()) ? c'est pas très joli ...

n°916105
LeMicky
Posté le 06-12-2004 à 17:55:40  profilanswer
 

benou a écrit :

non.
C'est une histoire d'encoding. Un Writer te permet d'écrire des caractères (donc des chaines) sans te souscier du charset, c'est à dire de la façon dont un caractère est écrit sous forme de bits. C'est de la responsabilité du writer.
 
pour illustrer, regarde la classe OutputStreamWriter : elle permet de passer d'un outputstream à un writer en indicant l'encoding à utiliser
 
D'ailleurs, comment veux-tu utiliser un OutputStream pour écrire une chaine ? en faisant des write(taChaine.getBytes()) ? c'est pas très joli ...


 
:)
 
regarde, j'avais fait un EDIT sur mon post.
Sinon non, quand j'en avais eu besoin, j'avais effectivement fait un Writer :) , c'est juste que sur le coup, je ne me souvenais plus de la différence. Je ne connais pas les API par coeur ;)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  probleme ecriture fichier

 

Sujets relatifs
Petit problème - tableauProblème de récupération de type MIME
Test d'existance d'un fichierProbleme de xslfo + php
[VB] Ecriture d'un ficher txt en unicodeProblème de noob ecriture/lecture fichier texte
Problème écriture dans fichier texteEcriture dans un fichier XLS : problème de format
[C++ Builder] Problème étrange entre OpenDialog & écriture de fichiertoujours mon problème d'écriture dans un fichier
Plus de sujets relatifs à : probleme ecriture fichier


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR