Manipulation des fichiers [Résolu]

tdaouas 27 Messages postés lundi 23 janvier 2006Date d'inscription 23 octobre 2017 Dernière intervention - 4 juil. 2009 à 22:05 - Dernière réponse : tdaouas 27 Messages postés lundi 23 janvier 2006Date d'inscription 23 octobre 2017 Dernière intervention
- 24 juil. 2009 à 13:19
Bonjour,
J'ai des programmes en C que je dois codifier en Java. Il s'agit de créer un fichier structuré, de rechercher des informations dans ces fichiers et de les modifier, etc.
C'est la première fois que je manipule des fichiers en Java, alors si quelqu'un peut m'aider en me disant d'abord si c'est le même principe qu'en C et quelles sont les fonctions pour ouvrir un fichier en lecture, en écriture, les fonctions pour lire un fichier, etc.

Merci d'avance

No dejes para mañana lo que puedes hacer hoy
Afficher la suite 

Votre réponse

26 réponses

Meilleure réponse
kirua12 1155 Messages postés samedi 17 janvier 2004Date d'inscription 29 avril 2011 Dernière intervention - 6 juil. 2009 à 10:28
3
Merci
normal, tu n'as pas instancié ta variable Resultat r

Merci kirua12 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de kirua12
kirua12 1155 Messages postés samedi 17 janvier 2004Date d'inscription 29 avril 2011 Dernière intervention - 5 juil. 2009 à 19:10
0
Merci
Salut,

toutes les classes nécessaires sont dans le package java.io
Commenter la réponse de kirua12
tdaouas 27 Messages postés lundi 23 janvier 2006Date d'inscription 23 octobre 2017 Dernière intervention - 5 juil. 2009 à 19:18
0
Merci
Merci pour ta réponse, oui j'y suis.
Je suis en train d'avancer doucement et ça l'air de marcher.
Merci

No dejes para mañana lo que puedes hacer hoy
Commenter la réponse de tdaouas
tdaouas 27 Messages postés lundi 23 janvier 2006Date d'inscription 23 octobre 2017 Dernière intervention - 5 juil. 2009 à 23:23
0
Merci
Par contre après une journée de lecture des différents cours que j'ai trouvé, voilà mon code. Il s'agit de la création d'un fichier structuré où chaque enregistrement est une classe contenant un nom, un prénom et une note.
Mon programme se bloque à la ligne r.setNom(lireChaine()); 
Si quelqu'un manipule bien les stream et pourrait m'aider je le remercie d'avance.
***************************

import java.io.*;
import java.util.Scanner;
import java.lang.String;

public class Crefich {
    /**
     * @param args
     */
 
    public class Resultat implements java.io.Serializable {
        /**
         *
         */
        private static final long serialVersionUID = 1L;
        /**
         *
         */
        public String nom = "";
        public String prenom = "";
        public float note = 0;

        public Resultat(final String nom, final String prenom, final float note) {
        this.nom = nom;
        this.prenom = prenom;
        this.note = note;
        }   
       
        public void setNom(final String nom) {
            this.nom = nom;
            }
       
        public void setPrenom(final String prenom) {
            this.prenom = prenom;
            }
       
        public void setNote(final Float note) {
            this.note = note;
            }
    }

   
    public static String lireChaine() {
        Scanner sc = new Scanner(System.in);
        return sc.next();
    }
   
    public static Float lireReel() {
        Scanner sc = new Scanner(System.in);
        return sc.nextFloat();
    }
   
    @SuppressWarnings("null")
    public static void main(String[] args) {
        // TODO Auto-generated method stub
       
        System.out.println("Nom du fichier: ");
        String nomFichier=lireChaine();
    
        Resultat r = null;
        try
        {
       
        FileOutputStream monFichier =new FileOutputStream(nomFichier);
        ObjectOutputStream oos=new ObjectOutputStream(monFichier);
        System.out.println("Voulez vous saisir un nouveau résultat (O/N) ?");
        String reponse=lireChaine();
       
        while ((reponse.toUpperCase()).equals("O"))
        {                   
            System.out.println("Nom: "); 
            r.setNom(lireChaine());    // LE PROGRAMME S'ARRETE ICI
            System.out.println("Prénom: ");
            r.setPrenom(lireChaine());
            System.out.println("Note: ");
            r.setNote(lireReel());;
       
            oos.writeObject(r);
            oos.flush();
          
            System.out.println("Voulez vous saisir un nouveau résultat (O/N) ?");
            reponse =lireChaine();
        }
        oos.close();
        }
        catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }
}

***************************************

No dejes para mañana lo que puedes hacer hoy
Commenter la réponse de tdaouas
tdaouas 27 Messages postés lundi 23 janvier 2006Date d'inscription 23 octobre 2017 Dernière intervention - 6 juil. 2009 à 15:51
0
Merci
Merci, peux tu me dire comment je peux le faire?

No dejes para mañana lo que puedes hacer hoy
Commenter la réponse de tdaouas
kirua12 1155 Messages postés samedi 17 janvier 2004Date d'inscription 29 avril 2011 Dernière intervention - 6 juil. 2009 à 15:58
0
Merci
ben, euh,
Resultat r = new Resulat();

et tu dois ajouter un constructeur sans paramétre.
Commenter la réponse de kirua12
tdaouas 27 Messages postés lundi 23 janvier 2006Date d'inscription 23 octobre 2017 Dernière intervention - 6 juil. 2009 à 16:08
0
Merci
L'instanciation
Resultat r = new Resulat();
Je l'ai déjà essayée mais j'avais toujours une erreur, c'est seulement quand j'ai mis Resultat r = null; que ça a marché.

Mais peut être le constructeur, oui c'est vrai je n'ai pas mis cela, mais excusez moi, n'oubliez pas que je suis très débutante en Java, donc je ne vois pas comment le faire.

No dejes para mañana lo que puedes hacer hoy
Commenter la réponse de tdaouas
kirua12 1155 Messages postés samedi 17 janvier 2004Date d'inscription 29 avril 2011 Dernière intervention - 6 juil. 2009 à 16:36
0
Merci
dans la classe Resultat, tu ajoutes simplement :
public Resultat(){

}
Commenter la réponse de kirua12
tdaouas 27 Messages postés lundi 23 janvier 2006Date d'inscription 23 octobre 2017 Dernière intervention - 6 juil. 2009 à 18:13
0
Merci
En faisant ces modifications, voici le message d'erreur que j'ai:
No enclosing instance of type Crefich is accessible. Must qualify the allocation with an enclosing instance of type Crefich (e.g. x.new A() where x is an instance of Crefich).

No dejes para mañana lo que puedes hacer hoy
Commenter la réponse de tdaouas
kirua12 1155 Messages postés samedi 17 janvier 2004Date d'inscription 29 avril 2011 Dernière intervention - 7 juil. 2009 à 09:16
0
Merci
normal, vu que tu as défini une classe interne. D'ailleurs je ne vois aucune raison pour que cette classe soit une classe interne.
Sors ta classe Resultat de la classe CreFich pour que ce soit une classe normale et ça marchera
Commenter la réponse de kirua12
tdaouas 27 Messages postés lundi 23 janvier 2006Date d'inscription 23 octobre 2017 Dernière intervention - 7 juil. 2009 à 09:52
0
Merci
Cher kirua12, je te remercie beaucoup pour ton aide, c'est vrai quand j'ai rendu la classe externe tout a marché sans problème.
Maintenant je vais faire un programme qui lit le fichier que j'ai créé pour boucler.

Encore merci

No dejes para mañana lo que puedes hacer hoy
Commenter la réponse de tdaouas
tdaouas 27 Messages postés lundi 23 janvier 2006Date d'inscription 23 octobre 2017 Dernière intervention - 7 juil. 2009 à 14:22
0
Merci
Re bonjour,

Pour la lecture de mon fichier, j'ai écris ce code. Il s'arrête de l'exécution dans la ligne Resultat r = (Resultat) ois.readObject();
Pourtant je lis le fichier que j'ai créé avec le programme précédent.
Voici le code:
**************************************

import java.io.*;
import java.util.Scanner;

@SuppressWarnings("serial")
class Resultat implements java.io.Serializable {

     public String nom = "";
     public String prenom = "";
     public float note = 0;
          
    public Resultat(String nom, String prenom, float note) {
    this.nom = nom;
    this.prenom = prenom;
    this.note = note;
    }   
   
    public Resultat() {
        // TODO Auto-generated constructor stub
    }
   
    public String getNom() {
        return nom;
        }
   
    public String getPrenom() {
        return prenom;
        }
   
    public float getNote() {
        return note;
        }
}

public class Lecturefich {

    /**
     * @param args
     */
   
    public static String lireChaine() {
        Scanner sc = new Scanner(System.in);
        return sc.next();
    }
   
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        System.out.println("Nom du fichier: ");
        String nomFichier=lireChaine();
       
        try
        {
            FileInputStream fichier = new FileInputStream(nomFichier);
            ObjectInputStream ois = new ObjectInputStream(fichier);

            Resultat r = (Resultat) ois.readObject();    //ARRET DE L'EXECUTION ICI

            while (!r.equals(null))
        {
                       
            System.out.println("nom : "+r.getNom());
            System.out.println("prenom : "+r.getPrenom());
            System.out.println("taille : "+r.getNote());
            r = (Resultat) ois.readObject();
                    
        }
        }
        catch (java.io.IOException e) {
            e.printStackTrace();
            }
            catch (ClassNotFoundException e) {
            e.printStackTrace();
            }
       
    }

    }

****************************************
Merci

No dejes para mañana lo que puedes hacer hoy
Commenter la réponse de tdaouas
kirua12 1155 Messages postés samedi 17 janvier 2004Date d'inscription 29 avril 2011 Dernière intervention - 7 juil. 2009 à 14:40
0
Merci
quelle est l'erreur ?
Commenter la réponse de kirua12
tdaouas 27 Messages postés lundi 23 janvier 2006Date d'inscription 23 octobre 2017 Dernière intervention - 7 juil. 2009 à 16:07
0
Merci
Une erreur d'exécution, la voici:
java.io.InvalidClassException: Resultat; local class incompatible: stream classdesc serialVersionUID -3764480536014271752, local class serialVersionUID -3285461882783943804
    at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at Lecturefich.main(Lecturefich.java:63)

No dejes para mañana lo que puedes hacer hoy
Commenter la réponse de tdaouas
kirua12 1155 Messages postés samedi 17 janvier 2004Date d'inscription 29 avril 2011 Dernière intervention - 7 juil. 2009 à 16:19
0
Merci
Différence de structure entre les objets (pour simplifier).
Quand tu as créé ton fichier, ta classe Resultat avait une certaine structure. Quand tu relis le fichier, la structure de la classe Resultat est différente.

Exécute d'abord le 1er code pour créer le fichier et lis le dans la foulée, ça devrait marcher.

Pense à ajouter le champ serialVersionUID dans ta classe Resultat pour éviter ce problème
Commenter la réponse de kirua12
tdaouas 27 Messages postés lundi 23 janvier 2006Date d'inscription 23 octobre 2017 Dernière intervention - 7 juil. 2009 à 17:15
0
Merci
Oui en fait, quand j'ai ajouté serialVersionUID ça a marché. Sauf qu'il reste juste un petit souci. C'est qu'il m'affiche toujours le même enregistrement, donc la variable ois (ObjectInputStream) que j'ai créé ne s'écrase pas à chaque readObject, elle garde les mêmes premiers données.

No dejes para mañana lo que puedes hacer hoy
Commenter la réponse de tdaouas
kirua12 1155 Messages postés samedi 17 janvier 2004Date d'inscription 29 avril 2011 Dernière intervention - 8 juil. 2009 à 10:00
0
Merci
C'est ta méthode d'écriture qui pose problème.
Tu dois créer une nouvelle instance de la classe Resultat dans ta boucle while.
Commenter la réponse de kirua12
tdaouas 27 Messages postés lundi 23 janvier 2006Date d'inscription 23 octobre 2017 Dernière intervention - 8 juil. 2009 à 14:42
0
Merci
Oui exactement, l'instanciation à l'écriture a résolu le problème, merci 

No dejes para mañana lo que puedes hacer hoy
Commenter la réponse de tdaouas
tdaouas 27 Messages postés lundi 23 janvier 2006Date d'inscription 23 octobre 2017 Dernière intervention - 8 juil. 2009 à 20:58
0
Merci
Salut kirua12,
Sais tu si c'est possible avec le même système des stream de faire une recherche avec le nom et s'il est trouvé de modifier sa note.
Quand je l'ai programmé, j'ai créé deux stream un output et un input mais lorsque j'ai écrit tout le fichier a été écrasé par l'écriture!

Merci

No dejes para mañana lo que puedes hacer hoy
Commenter la réponse de tdaouas
kirua12 1155 Messages postés samedi 17 janvier 2004Date d'inscription 29 avril 2011 Dernière intervention - 9 juil. 2009 à 09:32
0
Merci
ce type de sérialisation n'est pas vraiment prévu pour faire de la recherche. Tu vas être obligé de charger toutes les données, de les modifier et de les écrire dans leur ensemble.
Si tu veux faire de la recherche soit tu regardes du côté des fichiers XML (xpath, jdom ...) soit côté base de données
Commenter la réponse de kirua12

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.