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

Langage Java Discussion :

ajouter une ligne en debut de fichier


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 36
    Points
    36
    Par défaut ajouter une ligne en debut de fichier
    bonjour,
    j'ai tout essayé pour rajouté une ligne en début de fichier sans écraser le contenu mais impossible, j'ai même essayé avec randomaccessfile mais rien.
    le problème c'est que j'ai des fichiers très volumineux donc la solution qui consiste a en créer un autre et tout copier, prendrai énormément de temps chose qui n'ai pas bien pour mon application.
    si quelqu'un sait comment faire...
    merci

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par filor Voir le message
    le problème c'est que j'ai des fichiers très volumineux donc la solution qui consiste a en créer un autre et tout copier, prendrai énormément de temps
    C'est pourtant la seule solution...

    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    C'est pourtant la seule solution...
    Et non ce n'est pas la seule façon de faire, On peut même éviter de recréer un autre fichier temporaire puis le renommer..

  4. #4
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hibour Voir le message
    Et non ce n'est pas la seule façon de faire, On peut même éviter de recréer un autre fichier temporaire puis le renommer..
    Je serais bien curieux de voir cela !

    a++

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 36
    Points
    36
    Par défaut
    bonsoir,
    STP hibour c'est quoi alors la solution. la copie de fichierv me prend u temps monstre et la gestion du temps est trés importante dans mon projet .

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par hibour Voir le message
    Et non ce n'est pas la seule façon de faire, On peut même éviter de recréer un autre fichier temporaire puis le renommer..
    Je suis particulièrement impatient de connaître ta solution. En effet, elle permettrait de révolutionner l'informatique du 21eme siècle !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Je ne pense pas que ça va révolutionner l'informatique puisqu'il y a des gens qu'ils l'ont déjà fait Voici le lien InsertTextInCSharp.
    Le principe est simple : même algorithme que l'insertion dans un tableau.
    Agrandir le fichier de longueur des données à insérer càd
    newLength = fileLength+ data.length.
    lire à partir de la fin N byte dans un buffer les écrire a partir d'une position ou la fin de ce buffer coincide avec la fin de la nouvelle taille.
    Itérer en lisant le morceau suivant a partir de la fin..
    Voilà en gros l'idée, Dès que je l'implémente je mettrai le code ici
    a++

  8. #8
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Donc pour insérer en début du fichier tu recopies tout... on est bien d'accord !

    a++

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Oui insérer un élément au début d'un tableau demande de décaler les n-1 élément avant, c'est le pire des cas malheureusement. mais on est bien d'accord qu'on a pas besoin de construire un autre fichier, le renommer, et supprimer l'ancien => je pense que c'est beaucoup plus rapide.

  10. #10
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hibour Voir le message
    on a pas besoin de construire un autre fichier, le renommer, et supprimer l'ancien => je pense que c'est beaucoup plus rapide.
    Je ne suis pas persuadé que cela fasse une très grosse différence... Après tout il faut quand même recopier tout le fichier.

    Surtout qu'en manipulant de gros fichier avec les FileChannel on peut faire la copie très rapidement.


    Mais bon perso c'est surtout l'intérêt d'insérer des données au début du fichier qui m'échappe un peu...

    a++

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Insérer des données au début d'un fichier peut être utile par exemple dans le cas d'un fichier XML dont on a son arbre DOM ou on a rajouter un élément avant la racine ..

  12. #12
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par hibour Voir le message
    Je ne pense pas que ça va révolutionner l'informatique puisqu'il y a des gens qu'ils l'ont déjà fait Voici le lien InsertTextInCSharp.
    Le principe est simple : même algorithme que l'insertion dans un tableau.
    Agrandir le fichier de longueur des données à insérer càd
    newLength = fileLength+ data.length.
    lire à partir de la fin N byte dans un buffer les écrire a partir d'une position ou la fin de ce buffer coincide avec la fin de la nouvelle taille.
    Itérer en lisant le morceau suivant a partir de la fin..
    Voilà en gros l'idée, Dès que je l'implémente je mettrai le code ici
    a++
    Il ne faut surtout pas utiliser cette technique si les données manipulées sont sensibles. En effet, s'il y a un plantage système ou algorithme durant le déplacement, le fichier est corrompu.
    De plus, l'algorithme est plus compliqué que la copie intégrale dans un nouveau fichier, pour un gain nul en temps.
    Mais je persiste et je signe : il n'est pas possible d'ajouter des octets en début de fichier sans en recopier l'intégralité, peu importe l'endroit (fichier identique ou séparé).
    Par contre, si le fichier est volumineux, que l'espace disque est limité et que les données ne sont pas sensibles, alors cette technique est valable

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    De plus, l'algorithme est plus compliqué que la copie intégrale dans un nouveau fichier, pour un gain nul en temps.
    Ton affirmation est elle réconforté par des testes sur des fichiers de grand volumes!!

  14. #14
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 36
    Points
    36
    Par défaut
    bonsoir,
    c'est justement mon cas les fichiers trés volumineux, au fait je recupere des fichier XML que je dois traiter, les fichiers sont des XML tronqués donc sans racine, impossible de les traiter sans ajouter une racine et la fermer a la fin.je ne sais plus comment faire???
    merci.

  15. #15
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par filor Voir le message
    au fait je recupere des fichier XML que je dois traiter, les fichiers sont des XML tronqués donc sans racine, impossible de les traiter sans ajouter une racine et la fermer a la fin.
    Ah enfin un cas concret !

    Tu les traites comment tes fichiers XML ? En Java ???

    a++

  16. #16
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 36
    Points
    36
    Par défaut
    oui en java sous eclipse...au fait ça fait 6 mois que je travaille dessus je modifier les fichiers en entrée manuellement en me disant que c'est un truc facile que de modifier un fichier via java.et la....je sais pas comment faire...

  17. #17
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Disons que comme on l'a dit, pour modifier le fichier il est préférable de passer par un fichier temporaire, et là c'est tout simple

    Maintenant dans ton cas tu n'a pas forcément besoin de faire cela !

    Il te suffit de créer ta propre classe héritant d'InputStream/Reader (selon le type de flux que tu utilises), et d'y cumuler plusieurs sources de données. Par exemple en lisant les données depuis trois source : la première sera l'ouverture de la balise, la seconde ton fichier, et la dernière ta fermeture de balise.

    Au niveau Java tu verras cela comme une source unique, et tu pourras traiter ton fichier comme s'il contenait ces données...

    a++

  18. #18
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 36
    Points
    36
    Par défaut
    bonjour,
    ok j'ai pas tout compris mais je vais essayé merci beaucoup.

  19. #19
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Ben par exemple si tu utilises un Reader :
    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
    public class MultiReader extends Reader {
    	private final Reader[] sources;
    	private int current;
     
    	public MultiReader(Reader...sources) {
    		this.sources = sources;
    		this.current = 0;
    	}
     
    	/* Retourne le reader courant */
    	private Reader current() {
    		return this.sources[this.current];
    	}
     
    	/* Passe au reader suivant si possible */
    	private boolean useNext() {
    		if (this.current+1 < this.sources.length) {
    			this.current++;
    			return true;
    		}
    		return false;
    	}
     
    	@Override
    	public int read(char[] cbuf, int off, int len) throws IOException {
    		int ret = -1;
    		do {
    			// On tente de lire les données courantes :
    			ret = current().read(cbuf, off, len);
    			// En passant au suivant à la fin d'un Reader :
    		} while ( ret<0 && useNext());
    		return ret;
    	}
     
    	@Override
    	public void close() throws IOException {
    		IOException exceptionOccured = null;
    		// On ferme tous les Reader :
    		for (Reader r : this.sources) {
    			try {
    				r.close();
    			} catch (IOException e) {
    				exceptionOccured = e;
    			}
    		}
    		if (exceptionOccured!=null) {
    			// warning : on ne remonte que la dernière exception :
    			throw exceptionOccured;
    		}
    	}
    }
    cette classe permet de concaténer plusieurs reader en un seul et unique, afin d'être vue comme une source de donnée unique.

    Tu peux ainsi ajouter des données avant/après ton fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	Reader r = new MultiReader(
    		new StringReader("<xml>"),
    		new FileReader("a.txt"),
    		new StringReader("</xml>")
    	);
    	try {
    		// ...
    	} finally {
    		r.close();
    	}

    a++

  20. #20
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 36
    Points
    36
    Par défaut
    merci beaucoup
    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public int read(char[] cbuf, int off, int len) throws IOException {
    		int ret = -1;
    		do {
    			// On tente de lire les données courantes :
    			ret = current().read(cbuf, off, len);
    			// En passant au suivant à la fin d'un Reader :
    		} while ( ret<0 && useNext());
    j'ai pas bien compris les parametres d'entrée

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Ajouter une ligne au debut de dataGridView
    Par abd75web dans le forum VB.NET
    Réponses: 2
    Dernier message: 31/12/2013, 15h26
  2. [WD14] ajouter une ligne table avec 2 fichiers
    Par matrixdine dans le forum WinDev
    Réponses: 2
    Dernier message: 01/11/2011, 22h24
  3. Ajouter une ligne en début de fichier
    Par MB_MathemaTeX dans le forum Général Python
    Réponses: 4
    Dernier message: 20/03/2010, 18h02
  4. ajouter une ligne en debut de fichier
    Par kespy13 dans le forum Langage
    Réponses: 7
    Dernier message: 15/05/2008, 14h27
  5. 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

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