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

Entrée/Sortie Java Discussion :

[IO] écraser une ligne


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Par défaut [IO] écraser une ligne
    Bonjour,

    jai un fichier avec une requete sql par ligne.
    Mon algo doit les lires une à une et les exécuter.

    Pour être sur de ne jamais exécuter une requete deux fois, j'efface le fichier à la fin.
    Le problème est que si si l'algo est interompu, a la prochène exécution, les requete déjà exécutées le seroçnt à nouveau.

    Je voudrai donc "taguer" chaque ligne juste après leur éxécution en inscrivant un caractaitre "¤" en début de ligne par exemple. Ou mieux, en effacant la ligne. Et cela sans réécrir le fichier entièrement à chaque fois...

    J'ai chercher sur google, le problème n'a pas l'air si triviale que ça...

    Merci d'avence,
    ++Floanne.

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    On ne peut pas réécrire partiellement dans un fichier.

    Lorsqu'on ouvre un fichier en écriture, on écrase forcément son contenu. Donc si tu veux remplacer uniquement la ligne 1 , tu dois le faire... puis réécrire toutes les lignes suivantes!

    Réécrire tout ton fichier à chaque exécution d'une ligne, ce n'est pas forcément optimal... alors voilà ce que je te propose:

    tu ouvres un deuxième fichier en écriture: à chaque ligne exécutée, tu l'ajoutes dans ce deuxième fichier (sans oublier de faire un "flush()" pour qu'il soit réellement écrit en cas d'interruption inattendue de ton programme).

    lorsque tu as une requête sql à exécuter, tu vérifies dans ce deuxième fichier si elle ne s'y trouve pas déjà.

    Bien sûr, tu peux optimiser ce système en chargeant ce deuxième fichier en mémoire au démarrage de ton application si il existe. Comme ça lors de l'exécution du programme, tu n'y accèdes qu'en écriture.
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Citation Envoyé par CyberChouan
    On ne peut pas réécrire partiellement dans un fichier.

    Lorsqu'on ouvre un fichier en écriture, on écrase forcément son contenu. Donc si tu veux remplacer uniquement la ligne 1 , tu dois le faire... puis réécrire toutes les lignes suivantes!

    Réécrire tout ton fichier à chaque exécution d'une ligne, ce n'est pas forcément optimal... alors voilà ce que je te propose:

    tu ouvres un deuxième fichier en écriture: à chaque ligne exécutée, tu l'ajoutes dans ce deuxième fichier (sans oublier de faire un "flush()" pour qu'il soit réellement écrit en cas d'interruption inattendue de ton programme).

    lorsque tu as une requête sql à exécuter, tu vérifies dans ce deuxième fichier si elle ne s'y trouve pas déjà.

    Bien sûr, tu peux optimiser ce système en chargeant ce deuxième fichier en mémoire au démarrage de ton application si il existe. Comme ça lors de l'exécution du programme, tu n'y accèdes qu'en écriture.
    Ouil-ouil-ouil que lis-je ? Charger le fichier en mémoire ? que se passera-t-il lorsque le fichier aura évolué fera dans 10 ans 100 giga-octets ( ne me dis par qu'on aura des barettes de 1tera ) ?
    Tout ça pour dire : mon projet de fichiers mappés et plus particulièrement leurs modifications commence a voir le jour. Encore qq semaine et il sera dispo en open source. Ce projet consiste à pouvoir faire des modifs sur des données originales de manière bufferisées, sans avoir 15 milliards d'io pour changer une simple ligne au milieu d'un fichier texte de plusieurs gigas...
    a suivre

  4. #4
    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,


    Tu peux utiliser les RandomAccessFile pour cela, et revenir au début de la ligne afin de la modifier en écrasant des caractères), par exemple :
    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
    		RandomAccessFile raf = new RandomAccessFile(new File("test.sql"), "rwd");
    		try {
    			String line;	// ligne lu
    			long start = 0;	// position de départ
    			long end = 0;	// position de fin
     
    			// Lecture ligne par ligne :
    			while ( (line=raf.readLine()) != null) {
    				System.err.println("READ : " + line);
    				if (line.charAt(0)!='¤') {
    					// On 'enregistre' la position courante (fin de ligne) :
    					end = raf.getFilePointer();
    					// On retourne à la position précédente (début de ligne) :
    					raf.seek(start);
    					// On écrit un caractère :
    					raf.write('¤');
    					// Et on se replace à la fin de la ligne
    					start = end;
    					raf.seek(start);
     
    					// Traitement de la ligne
    					traitement(line);
    				}
     
    			}
    		} finally {
    			raf.close();
    		}
    a++

  5. #5
    Membre confirmé Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Par défaut
    Merci à vous deux, je pense que je vais prendre la solution de CyberChouan : c'est très bien pour ce que je veux faire...

    ++Floanne.

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

Discussions similaires

  1. Ajouter une ligne en fin de fichier sans écraser le fichier
    Par Premium dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 05/04/2007, 13h07
  2. écraser une ligne dans un fichier
    Par grand_duck dans le forum C
    Réponses: 8
    Dernier message: 29/09/2005, 11h11
  3. Réponses: 9
    Dernier message: 12/08/2002, 07h38
  4. [TP]lire une ligne de l'ecran et la stocker dans une chaine
    Par Bleuarff dans le forum Turbo Pascal
    Réponses: 26
    Dernier message: 02/07/2002, 10h08
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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