probleme ecriture fichier

probleme ecriture fichier - Java - Programmation

Marsh Posté le 06-12-2004 à 15:37:15    

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
Reply

Marsh Posté le 06-12-2004 à 15:37:15   

Reply

Marsh Posté le 06-12-2004 à 16:27:55    

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

Reply

Marsh Posté le 06-12-2004 à 16:32:30    

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

Reply

Marsh Posté le 06-12-2004 à 16:45:01    

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.

Reply

Marsh Posté le 06-12-2004 à 16:53:53    

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 ...

Reply

Marsh Posté le 06-12-2004 à 16:55:32    

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());
        }
     }

Reply

Marsh Posté le 06-12-2004 à 17:09:55    

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
 

Reply

Marsh Posté le 06-12-2004 à 17:21:57    

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);
....
 

Reply

Marsh Posté le 06-12-2004 à 17:25:27    

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?

Reply

Marsh Posté le 06-12-2004 à 17:29:24    

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

Reply

Marsh Posté le 06-12-2004 à 17:29:24   

Reply

Marsh Posté le 06-12-2004 à 17:36:28    

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 );

Reply

Marsh Posté le 06-12-2004 à 17:42:13    

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
Reply

Marsh Posté le 06-12-2004 à 17:46:49    

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
Reply

Marsh Posté le 06-12-2004 à 17:51:39    

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 ...

Reply

Marsh Posté le 06-12-2004 à 17:55:40    

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 ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed