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 :

Incrémentation d'une variable dans un fichier .txt


Sujet :

Java

  1. #1
    Membre régulier
    Homme Profil pro
    Informatique
    Inscrit en
    Mai 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2011
    Messages : 133
    Points : 77
    Points
    77
    Par défaut Incrémentation d'une variable dans un fichier .txt
    Bonjour à tous

    J'ai un fichier dans lequel j'insère des lignes:
    H01:aure
    H02:beber

    ainsi de suite. Le problème est que quand je ferme mon fichier et que j'insère de nouveau l'incrémentation de mes H0 recommence à 1 alors que je voudrai qu'elle recommence depuis le dernier enregistré. Ici ce serait H03:bidule

    voici 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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    Dans Hotel
    public Hotel(String nom, String ville, String adresse, int nbStars, int nbRoom, String tel){
    		idH=i;
    		i++;
    		nomH=nom;
    		villeH=ville;
    		adresseH=adresse;
    		nbEtoiles=nbStars;
    		nbChambres=nbRoom;
    		telH=tel;
    	}
     
    	public int getID(){
    		return i;
    	}
     
     
    	public String infos() {
    		return (Integer.toString(idH)+":"+nomH+":"+villeH+":"+adresseH+":"+Integer.toString(nbEtoiles)+":"+Integer.toString(nbChambres)+":"+telH+"\n");
    	}
     
     
     
     
     
     
    Dans CentraleImpl
     
    public void enregistrerH(String nomH, String villeH, String adresseH, int nbEtoiles, int nbChambres, String telephoneH) throws RemoteException, FileNotFoundException, IOException {
    		Annuaire annu = new Annuaire("FichierHotels.txt");
    		Hotel h = new Hotel(nomH,villeH,adresseH,nbEtoiles,nbChambres,telephoneH);
    		System.out.println(h.getID());
    		annu.ajoutInfos(h.infos());
     
    	}
     
     
     
    Dans Annuaire
     
    public synchronized boolean ajoutInfos(String infos) {
    		try {
    			// ouvre le fichier en ajout en fin de fichier
    			PrintWriter sortieFichier =
    				new PrintWriter(new FileWriter(nomFichier, true));
    			// on ecrit les infos
    			sortieFichier.print(infos);
    			// on ferme le fichier
    			sortieFichier.close();
    			return true;
    		} catch(IOException ex) {
    			// il y a eu une erreur
    			ex.printStackTrace();
    			return false;
    		}
    	}
    Avez vous une idée ?

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Il te suffit de setter i avec la bonne valeur au moment voulu. Mais au vu du code (qui est partiel), ca ne devrait pas être nécessaire, faut voir comment tu défini ta variable i.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Homme Profil pro
    Informatique
    Inscrit en
    Mai 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2011
    Messages : 133
    Points : 77
    Points
    77
    Par défaut
    Oui d'accord, mais je ne vois pas à quel endroit pour le coup =(

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Il faut voir si tu exécute tes enregistrement dans la même instance du programme, si tu le fais dans différente instances (successive), si la variable i est statique etc ... impossible de te dire cela comme ca.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre régulier
    Homme Profil pro
    Informatique
    Inscrit en
    Mai 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2011
    Messages : 133
    Points : 77
    Points
    77
    Par défaut
    J'ai bien une variable i qui est static. En fait j'ai 1 classe qui instancie une autre. Dans la classe qui est instanciée à chaque appel du constructeur il y aune variable i qui est static qui est incrémentée. Cependant quand on fait appel au constructeur elle perd cet incrément. J'ai l'impression qu'il ne garde pas du tout en mémoire la valeur associée

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    C'est bien d'essayer de décrire ce que tu fais, mais il faut montrer le code.

    Il est où ce i ? Elle est appelée quand et quand, cette méthode ? Comment le voit-on dans le code ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre régulier
    Homme Profil pro
    Informatique
    Inscrit en
    Mai 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2011
    Messages : 133
    Points : 77
    Points
    77
    Par défaut
    Oui pardon c'est vrai que c'est mieux avec le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dans CentraleImpl
     
    public void enregistrerH(String nomH, String villeH, String adresseH, int nbEtoiles, int nbChambres, String telephoneH) throws RemoteException, FileNotFoundException, IOException {
    		Annuaire annu = new Annuaire("FichierHotels.txt");
    		Hotel h = new Hotel(nomH,villeH,adresseH,nbEtoiles,nbChambres,telephoneH);
    		System.out.println(h.getID());
    		annu.ajoutInfos(h.infos());
     
    	}
    Dans ce code voici la méthode qui enregistre les instances dans un fichier.
    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
    Dans Annuaire
     
    public synchronized boolean ajoutInfos(String infos) {
    		try {
    			// ouvre le fichier en ajout en fin de fichier
    			PrintWriter sortieFichier =
    				new PrintWriter(new FileWriter(nomFichier, true));
    			// on ecrit les infos
    			sortieFichier.print(infos);
    			// on ferme le fichier
    			sortieFichier.close();
    			return true;
    		} catch(IOException ex) {
    			// il y a eu une erreur
    			ex.printStackTrace();
    			return false;
    		}
    	}
    Ce code est la méthode qui écrit dans mon fichier.

    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
    Dans Hotel
    private static int i = 1;
    public Hotel(String nom, String ville, String adresse, int nbStars, int nbRoom, String tel){
    		idH=i;
    		i++;
    		nomH=nom;
    		villeH=ville;
    		adresseH=adresse;
    		nbEtoiles=nbStars;
    		nbChambres=nbRoom;
    		telH=tel;
    	}
     
    	public int getID(){
    		return i;
    	}
     
     
    	public String infos() {
    		return (Integer.toString(idH)+":"+nomH+":"+villeH+":"+adresseH+":"+Integer.toString(nbEtoiles)+":"+Integer.toString(nbChambres)+":"+telH+"\n");
    	}
    Et enfin voici le constructeur et c'est ici que ma variable i devrait me retourner la bonne valeur

  8. #8
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Il te suffit de setter i avec la bonne valeur au moment voulu. Mais au vu du code (qui est partiel), ca ne devrait pas être nécessaire, faut voir comment tu défini ta variable i.
    Je pense que justement son problème c'est récupérer l'identifiant de son dernier Hotel enregistré dans le fichier, afin de l'incrémenter.Il lui faudrait simplement une méthode utilitaire qui prend en paramètre son fichier et lui retourne cet identifiant, et comme c'est le jour de chance de @beber005,voici ce code Utilitaire :
    Pour récuperer la derniere ligne du fichier :
    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
    47
     
    /**
             * Recupere les Nb dernieres lignes d'un fichier
             * @param file : Fichier pour lequel on recherche les Nb dernieres lignes
             * @param nbDernieresLignes : Nombre de lignes recherchees
             * @return
             */
    	public static String recupereNbDernieresLignes( File file, int nbDernieresLignes) {
    		try {
    			java.io.RandomAccessFile fileHandler = new java.io.RandomAccessFile( file, "r" );
    			long fileLength = file.length() - 1;
    			StringBuilder sb = new StringBuilder();
    			int line = 0;
    			for( long filePointer = fileLength; filePointer != -1; filePointer-- ) {
    				fileHandler.seek( filePointer );
    				int readByte = fileHandler.readByte();
    				if( readByte == 0xA ) {
    					if (line == nbDernieresLignes) {
    						if (filePointer == fileLength) {
    							continue;
    						} else {
    							break;
    						}
    					}
    				} else if( readByte == 0xD ) {
    					line = line + 1;
    					if (line == nbDernieresLignes) {
    						if (filePointer == fileLength - 1) {
    							continue;
    						} else {
    							break;
    						}
    					}
    				}
    				sb.append( ( char ) readByte );
    			}
    			sb.deleteCharAt(sb.length()-1);
    			String lastLine = sb.reverse().toString();
    			return lastLine;
    		} catch( java.io.FileNotFoundException e ) {
    			e.printStackTrace();
    			return null;
    		} catch( java.io.IOException e ) {
    			e.printStackTrace();
    			return null;
    		}
    	}
    Et pour recuperer cet identifiant :

    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
     
    /**
             * Retourne le dernier identifiant de lhotel
             * @param lastLine
             * @return
             */
    	public static Integer  recupLastIndex(String lastLine){
    		if (StringUtils.isNotBlank(lastLine)){
    			//Recupération du code Hotel
    			lastLine = lastLine.split(":")[0];
    			//Suppression du H
    			String idHotel = lastLine.substring(1);
    			return Integer.parseInt(idHotel);
    		}
    		return 0;
    	}
    Et voici la classe de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /**
             * @param args
             */
    	public static void main(String[] args) {
    	File file = new File("D:/flux/file-brouillon.txt");
    	System.out.println("Last Line = "+recupereNbDernieresLignes(file,1));
    System.out.println("Last ID Hotel="+recupLastIndex(recupereNbDernieresLignes(file,1)));
    	}
    Bon courage
    Vous avez peut être hâte de réussir et il n'y a rien de mal à cela...
    mais la patience est aussi une vertu; l'échec vous l'enseignera certainement..."

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Moui, enfin, c'est quand même diablement compliqué. A moins que le fichier soit en centaines de mégas, je me contenterais de lire les lignes dans l'ordre avec un simple BufferedReader.

    Et surtout, son problème c'est peut-être ça, et peut-être pas. On sait toujours pas quand et quand est appelée sa méthode enregistrerH(). Pourtant j'ai demandé.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre régulier
    Homme Profil pro
    Informatique
    Inscrit en
    Mai 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2011
    Messages : 133
    Points : 77
    Points
    77
    Par défaut
    Je vous remercie de votre aide les gars

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

Discussions similaires

  1. [Batch] Récupération d'une variable dans un fichier txt
    Par killgones dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 09/07/2014, 09h17
  2. Ecrire une variable dans un fichier txt
    Par 6116d dans le forum Langage
    Réponses: 11
    Dernier message: 31/03/2014, 17h08
  3. Réponses: 9
    Dernier message: 21/05/2007, 00h33
  4. modifier une variable dans un fichier
    Par Guismay dans le forum Langage
    Réponses: 7
    Dernier message: 11/09/2005, 19h46
  5. Réponses: 13
    Dernier message: 14/06/2003, 22h15

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