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

Java Discussion :

Une erreur bizarre avec les InputStream


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2007
    Messages : 50
    Par défaut Une erreur bizarre avec les InputStream
    Bonjour à tous !

    Je suis confrontée à un parsing de fichier XML que je fais avec SAX.
    SAX se refuse à parser : erreur "org.xml.sax.SAXParseException: Premature end of file."

    J'ai donc affiché ce que je parsais et je n'obtenais qu'un très beau fichier xml.
    J'ai donc stocké ce fichier dans un file pour voir s'il y avait des bytes en trop...

    Et là surprise !! Le fichier est incomplet, le code xml s'arrête en plein milieu ! Ca fait deux jours que j'essaye de voir d'où vient ce problème et très franchement je n'y arrive pas !

    Je vous fournis le code :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    InputStream is; //il est rempli par la suite
     
    result = new BufferedReader(new InputStreamReader(is)); //C'est ce que je dois traiter
     
    String line = null;
     String test = "";
     InputStream in = null;
     
                try {
                    while ((line = result.readLine()) != null) {
                        if (!line.equals("")) {  //J'enlève les lignes vides                    
                            test += line + "\n";
                        }
                    }
                } catch (IOException ex) {
                    Logger.getLogger(BlastManager.class.getName()).log(Level.SEVERE, null, ex);
                }
                try {
                    in = new ByteArrayInputStream(test.getBytes("UTF-8"));
                } catch (UnsupportedEncodingException ex) {
                    Logger.getLogger(BlastManager.class.getName()).log(Level.SEVERE, null, ex);
                }
     
     
      BufferedReader bouf = new BufferedReader(new InputStreamReader(in));
       BufferedWriter writetest = null;
     
                try {
                    writetest = new BufferedWriter(new FileWriter("hem.txt"));
                } catch (IOException ex) {
                    Logger.getLogger(BlastManager.class.getName()).log(Level.SEVERE, null, ex);
                }
     
               line = null;
                try {
                    while ((line = bouf.readLine()) != null) {
                            System.out.println(line); // Ca affiche le fichier XML COMPLET
                            writetest.write(line); // Créé un fichier avec le fichier XML INCOMPLET !!
                    }
                } catch (IOException ex) {
                    Logger.getLogger(BlastManager.class.getName()).log(Level.SEVERE, null, ex);
                }
     
                BlastParser parser = new BlastParser();
                parser.parse(in);
    Voilà... J'espère que vous pourrez m'aider.

    A savoir que le premier inputStream ne peux pas passer dans le parser, c'est une erreur interne au code BlastParser qui utilise la librairie Biojava, il faudrait que je corrige la librairie, j'ai un peu la flemme maintenant.

    Merci de votre temps

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Il faut soit :

    - fermer le flux : close()
    - vider le buffer : flush()

    sur ton fichier en sortie...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2007
    Messages : 50
    Par défaut
    J'ai ajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {
                    bouf.close();
     
                } catch (IOException ex) {
                    Logger.getLogger(BlastManager.class.getName()).log(Level.SEVERE, null, ex);
                }
    A la fin.

    Mais ça n'a rien changé, le fichier est quand même incomplet.

  4. #4
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    ouaich normal...

    il faut fermer TOUS les flux, et SURTOUT ceux qui écrivent (dans ton cas, writetest et pas bouf)...


  5. #5
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2007
    Messages : 50
    Par défaut
    Merci, le fichier est maintenant niquel !

    Mais il me fait toujours ma SAXException

    [Fatal Error] :1:1: Premature end of file.
    org.xml.sax.SAXParseException: Premature end of file.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    BlastParser parser = new BlastParser();
    parser.parse(in);
    Il y a quelque chose à savoir ou à faire sur l'InputStream avant de le passer en paramètre du parser SAX ? Ça commence à être désespérant... J'ai regardé comment est créée l'exception mais ça ne me parle pas trop.


    EDIT : Oui c'est normal c'est un code de test. Pour l'indentation c'est à cause du copier coller sur le forum.
    Pour la boucle, c'est comme ça qu'on nous a appris à le faire (tous nos profs font comme ça)

    Et je ne connaissais pas le try {} {} finally ! Merci je vais y jeter un oeil


    Pour le but : j'envoie les résultats d'un formulaire à un serveur web http://www.ncbi.nlm.nih.gov/BLAST/Doc/urlapi.html

    Les objets qui s'en occupent, récupèrent ensuite le résultat XML et le stock dans l'inputStream qui je traite ici.
    Je veux parser ce fichier XML spécifique (il s'agit d'un résultat BLAST pour ceux qui font de la bio) à l'aide de la librairie biojava qui utilise SAX pour ce faire.

    Mais je ne comprends pas pourquoi j'ai cette erreur parce que le fichier est bon...

  6. #6
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,



    Désolé mais le code est affreux :
    1. Une indentation et des déclarations dans tous les sens
    2. Des try/catch un peu partout pour une gestion des exceptions catastrophiques : en cas d'erreur tu loggues mais tu continues le traitement
    3. Une concaténation de String dans une boucle : il n'y a rien de mieux pour plomber les perfs...
    4. Aucun close()
    5. Une double lecture du fichier que je ne comprend pas.


    Donc :
    1. Présentes ton code correctement afin qu'il soit plus lisible.
    2. Utilises un seul et unique try/catch qui englobe TOUT ton traitement. Si tu n'arrives pas à lire le fichier source cela ne sert à rien de continuer...
    3. Pour concaténer des chaines, il faut utiliser la classe StringBuilder !
    4. Chaque ouverture d'un flux doit être suivi d'un try/finally pour refermer ce fichier proprement et au plus tôt (lire : Comment libérer proprement les ressources ?)
    5. Expliques un peu l'objectif de tout cela, car c'est tout sauf clair


    a++

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/05/2006, 10h49
  2. Réponses: 11
    Dernier message: 03/05/2006, 01h24
  3. Erreur bizarre avec le module DBI
    Par Jim_Nastiq dans le forum SGBD
    Réponses: 7
    Dernier message: 12/04/2006, 17h28
  4. [TRANSAQ SQL] INSERT comportement bizarre avec les REAL
    Par argyronet dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/12/2005, 11h47
  5. Charger et afficher une image jpg avec les mfc
    Par glop - pas glop dans le forum MFC
    Réponses: 3
    Dernier message: 11/02/2004, 18h59

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