Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Super urgent : écrire en entete d'un fichier, ou lire à partir de la fin.

17 réponses
Avatar
niconews
Bonjour,

je voudrais savoir comment je peux écrire en début d'un fichier, en
insérant en entete. En utilisant FileWriter et write, ça m'écrase tout.
Attention, le fichier initial est gros (20 à 30 Mo).

Autre solution : je sais écrire en fin d'un fichier (filewriter avec
option true) : je voudrais alors parcourir le fichier de la fin vers le
début : comment je fais un tel parcours ?

Merci par avance, c'est assez urgent.

Pensez à enlever nospam sur la réponse.


--

Comme disait ma grand-mère, "Parfois le chemin est long ..."

10 réponses

1 2
Avatar
Zouplaz
niconews - :

Bonjour,

je voudrais savoir comment je peux écrire en début d'un fichier, en
insérant en entete. En utilisant FileWriter et write, ça m'écrase tout.
Attention, le fichier initial est gros (20 à 30 Mo).

Autre solution : je sais écrire en fin d'un fichier (filewriter avec
option true) : je voudrais alors parcourir le fichier de la fin vers le
début : comment je fais un tel parcours ?

Merci par avance, c'est assez urgent.

Pensez à enlever nospam sur la réponse.




Tu renomes le fichier bidule existant en trucmuche.tmp
Tu crée un nouveau fichier bidule
Tu écrit ton entête dans bidule
Tu ouvres le fichier trucmuche
Tu écris le contenu du fichier trucmuche en ajout dans bidule
Tu fermes tout
Tu renommes trucmuche.tmp en bidule

Avatar
Zouplaz
niconews - :

Bonjour,

je voudrais savoir comment je peux écrire en début d'un fichier, en
insérant en entete. En utilisant FileWriter et write, ça m'écrase tout.
Attention, le fichier initial est gros (20 à 30 Mo).

Autre solution : je sais écrire en fin d'un fichier (filewriter avec
option true) : je voudrais alors parcourir le fichier de la fin vers le
début : comment je fais un tel parcours ?

Merci par avance, c'est assez urgent.

Pensez à enlever nospam sur la réponse.




Tu as ça aussi comme discussion sur le sujet : http://minilien.com/?
HyaJggYU7e


Et en plus, pour le même prix, tu as un message signé Paul Lutus !

Si il y en a qui savent qui c'est, on fait une incantation ensemble ;-)

Avatar
niconews
niconews - :


Bonjour,

je voudrais savoir comment je peux écrire en début d'un fichier, en
insérant en entete. En utilisant FileWriter et write, ça m'écrase tout.
Attention, le fichier initial est gros (20 à 30 Mo).

Autre solution : je sais écrire en fin d'un fichier (filewriter avec
option true) : je voudrais alors parcourir le fichier de la fin vers le
début : comment je fais un tel parcours ?

Merci par avance, c'est assez urgent.

Pensez à enlever nospam sur la réponse.





Tu renomes le fichier bidule existant en trucmuche.tmp
Tu crée un nouveau fichier bidule
Tu écrit ton entête dans bidule
Tu ouvres le fichier trucmuche
Tu écris le contenu du fichier trucmuche en ajout dans bidule
Tu fermes tout
Tu renommes trucmuche.tmp en bidule


alors, chez moi, trucmuche, fait 20 Mo et ca doit être actualisé toutes
les 30 secondes : mon écriture est faite toutes les 30 ''.

Ca risque pas faire beaucoup, le recopie toutes les 30'' de trucmuche
à la fin de bidule ?

Sinon, tu sais lire en java à partir de la fin ? genre readline mais
dans l'autre sens ?

merci

--

Comme disait ma grand-mère, "Parfois le chemin est long ..."


Avatar
Alain

niconews - :


Bonjour,

je voudrais savoir comment je peux écrire en début d'un fichier, en
insérant en entete. En utilisant FileWriter et write, ça m'écrase tout.
Attention, le fichier initial est gros (20 à 30 Mo).

Autre solution : je sais écrire en fin d'un fichier (filewriter avec
option true) : je voudrais alors parcourir le fichier de la fin vers
le début : comment je fais un tel parcours ?
a mon avis tu tiens là la solution




en problème viesn déjà de l'OS...
il y a de quoi écrire à la fin (mode append).

il y a de quoi écrire en lieu et place (mode read-write)... je sais pas
comment faire en java mais ca doit être faisable. mais c'est pas ton soucis.

pour Unix et NT il n'y a rien pour écrire avant le début d'un fichier...

pour toi je verrais guerre que écrire en append et lire par la fin avec
des FileChannel.position(FileChanel.size()-N)

a mon avis il faudrait que tu crée une sorte de buffereredinputstream
qui se branche sur un FileChannel obtenu a partit d'un FileInputStream

- tu démare avec une position de 0
- tu lis un block (read(block,FileChannel.length()-position-block.length)
- et là tu fournis les caractères un par un (ou mot a mot, bloc à bloc,
ligne à ligne) dans l'ordre inverse.
- et quand le block est lu a l'envers tu avance position de un block.

c'est un bel exercise de construction d'InputStream

ca se complique si tu essaye de retourner des record ou des lignes avec
les caractères dans l'ordre normal, mais c'est pas sorcier...

le mieux c'est peut être alors
d'avoir un stream qui retourne les caractères vraiement à l'envers un
par un, et un filter qui trouve les lignes et les remets a l'endroit...

n'oublie pas de mettre un buffered inputstream en tampon entre ton flux
et l'utilisateur (pas entre le flux et le fichier sinon tu peux pas le
controler, et de toute façon tu bufferise déjà )



Avatar
Zouplaz
niconews - :



Tu renomes le fichier bidule existant en trucmuche.tmp
Tu crée un nouveau fichier bidule
Tu écrit ton entête dans bidule
Tu ouvres le fichier trucmuche
Tu écris le contenu du fichier trucmuche en ajout dans bidule
Tu fermes tout
Tu renommes trucmuche.tmp en bidule


alors, chez moi, trucmuche, fait 20 Mo et ca doit être actualisé toutes
les 30 secondes : mon écriture est faite toutes les 30 ''.

Ca risque pas faire beaucoup, le recopie toutes les 30'' de trucmuche
à la fin de bidule ?



Ca dépend de la plateforme et la machine, chez moi la copie d'un fichier de
10Mo prends moins de 2 secondes avec du code natif, en Java ça sera peut-
être plus lent mais tu devrais essayer, tu risques rien...


Avatar
niconews
niconews - :



Tu renomes le fichier bidule existant en trucmuche.tmp
Tu crée un nouveau fichier bidule
Tu écrit ton entête dans bidule
Tu ouvres le fichier trucmuche
Tu écris le contenu du fichier trucmuche en ajout dans bidule
Tu fermes tout
Tu renommes trucmuche.tmp en bidule


alors, chez moi, trucmuche, fait 20 Mo et ca doit être actualisé toutes
les 30 secondes : mon écriture est faite toutes les 30 ''.

Ca risque pas faire beaucoup, le recopie toutes les 30'' de trucmuche
à la fin de bidule ?




Ca dépend de la plateforme et la machine, chez moi la copie d'un fichier de
10Mo prends moins de 2 secondes avec du code natif, en Java ça sera peut-
être plus lent mais tu devrais essayer, tu risques rien...


c'est vrai, je vais faire des tests de perf. Sinon, tu sais pas comment
lire ligne à ligne à partir de la fin d'un fichier texte ? ca me
résoudrait tout, en fait : plus besoin de copier le fichier ...

--

Comme disait ma grand-mère, "Parfois le chemin est long ..."



Avatar
Bruno Jouhier
"niconews" a écrit dans le message de news:
42472e0e$0$5160$
niconews - :


Bonjour,

je voudrais savoir comment je peux écrire en début d'un fichier, en
insérant en entete. En utilisant FileWriter et write, ça m'écrase tout.
Attention, le fichier initial est gros (20 à 30 Mo).

Autre solution : je sais écrire en fin d'un fichier (filewriter avec
option true) : je voudrais alors parcourir le fichier de la fin vers le
début : comment je fais un tel parcours ?

Merci par avance, c'est assez urgent.

Pensez à enlever nospam sur la réponse.





Tu renomes le fichier bidule existant en trucmuche.tmp
Tu crée un nouveau fichier bidule
Tu écrit ton entête dans bidule
Tu ouvres le fichier trucmuche
Tu écris le contenu du fichier trucmuche en ajout dans bidule
Tu fermes tout
Tu renommes trucmuche.tmp en bidule


alors, chez moi, trucmuche, fait 20 Mo et ca doit être actualisé toutes
les 30 secondes : mon écriture est faite toutes les 30 ''.

Ca risque pas faire beaucoup, le recopie toutes les 30'' de trucmuche à
la fin de bidule ?

Sinon, tu sais lire en java à partir de la fin ? genre readline mais dans
l'autre sens ?


Un fichier ça ne s'accède pas comme de la mémoire vive. En général, le
gestionnaire de fichiers peut facilement étendre un fichier par la fin, mais
n'a pas été conçu pour l'étendre par le début. C'est pour ça que les
bibliothèques d'I/O savent lire du début vers la fin et ajouter à la fin,
mais n'offrent en général pas de fonctions pour travailler dans l'autre
sens. Ces fonctions ne sont pas impossibles à implémenter mais elles
seraient terriblement inefficaces (pour insérer au début, il n'y a en
général pas d'autre choix que de faire les manips trucmuche/bidule
ci-dessus).

Donc, tu essaies de te battre contre l'OS. Il faut que tu repenses ta
solution, en intégrant la contrainte qu'un fichier, ça s'étend par la fin.

Bruno.



merci

--

Comme disait ma grand-mère, "Parfois le chemin est long ..."




Avatar
niconews
"niconews" a écrit dans le message de news:
42472e0e$0$5160$


niconews - :



Bonjour,

je voudrais savoir comment je peux écrire en début d'un fichier, en
insérant en entete. En utilisant FileWriter et write, ça m'écrase tout.
Attention, le fichier initial est gros (20 à 30 Mo).

Autre solution : je sais écrire en fin d'un fichier (filewriter avec
option true) : je voudrais alors parcourir le fichier de la fin vers le
début : comment je fais un tel parcours ?

Merci par avance, c'est assez urgent.

Pensez à enlever nospam sur la réponse.





Tu renomes le fichier bidule existant en trucmuche.tmp
Tu crée un nouveau fichier bidule
Tu écrit ton entête dans bidule
Tu ouvres le fichier trucmuche
Tu écris le contenu du fichier trucmuche en ajout dans bidule
Tu fermes tout
Tu renommes trucmuche.tmp en bidule


alors, chez moi, trucmuche, fait 20 Mo et ca doit être actualisé toutes
les 30 secondes : mon écriture est faite toutes les 30 ''.

Ca risque pas faire beaucoup, le recopie toutes les 30'' de trucmuche à
la fin de bidule ?

Sinon, tu sais lire en java à partir de la fin ? genre readline mais dans
l'autre sens ?



Un fichier ça ne s'accède pas comme de la mémoire vive. En général, le
gestionnaire de fichiers peut facilement étendre un fichier par la fin, mais
n'a pas été conçu pour l'étendre par le début. C'est pour ça que les
bibliothèques d'I/O savent lire du début vers la fin et ajouter à la fin,
mais n'offrent en général pas de fonctions pour travailler dans l'autre
sens. Ces fonctions ne sont pas impossibles à implémenter mais elles
seraient terriblement inefficaces (pour insérer au début, il n'y a en
général pas d'autre choix que de faire les manips trucmuche/bidule
ci-dessus).

Donc, tu essaies de te battre contre l'OS. Il faut que tu repenses ta
solution, en intégrant la contrainte qu'un fichier, ça s'étend par la fin.

Bruno.



OK, ca c'est acquis. Mais lire par la fin, comment je fais concrètement?
Ca pour ça j'ai moins besoin de performance.

Quelqu'un a un portion de code ?

Merci


merci

--

Comme disait ma grand-mère, "Parfois le chemin est long ..."







--

Comme disait ma grand-mère, "Parfois le chemin est long ..."




Avatar
Bruno Jouhier
"niconews" a écrit dans le message de news:
4247e9e4$0$28363$
"niconews" a écrit dans le message de news:
42472e0e$0$5160$


niconews - :



Bonjour,

je voudrais savoir comment je peux écrire en début d'un fichier, en
insérant en entete. En utilisant FileWriter et write, ça m'écrase tout.
Attention, le fichier initial est gros (20 à 30 Mo).

Autre solution : je sais écrire en fin d'un fichier (filewriter avec
option true) : je voudrais alors parcourir le fichier de la fin vers le
début : comment je fais un tel parcours ?

Merci par avance, c'est assez urgent.

Pensez à enlever nospam sur la réponse.





Tu renomes le fichier bidule existant en trucmuche.tmp
Tu crée un nouveau fichier bidule
Tu écrit ton entête dans bidule
Tu ouvres le fichier trucmuche
Tu écris le contenu du fichier trucmuche en ajout dans bidule
Tu fermes tout
Tu renommes trucmuche.tmp en bidule


alors, chez moi, trucmuche, fait 20 Mo et ca doit être actualisé toutes
les 30 secondes : mon écriture est faite toutes les 30 ''.

Ca risque pas faire beaucoup, le recopie toutes les 30'' de trucmuche à
la fin de bidule ?

Sinon, tu sais lire en java à partir de la fin ? genre readline mais dans
l'autre sens ?



Un fichier ça ne s'accède pas comme de la mémoire vive. En général, le
gestionnaire de fichiers peut facilement étendre un fichier par la fin,
mais n'a pas été conçu pour l'étendre par le début. C'est pour ça que les
bibliothèques d'I/O savent lire du début vers la fin et ajouter à la fin,
mais n'offrent en général pas de fonctions pour travailler dans l'autre
sens. Ces fonctions ne sont pas impossibles à implémenter mais elles
seraient terriblement inefficaces (pour insérer au début, il n'y a en
général pas d'autre choix que de faire les manips trucmuche/bidule
ci-dessus).

Donc, tu essaies de te battre contre l'OS. Il faut que tu repenses ta
solution, en intégrant la contrainte qu'un fichier, ça s'étend par la
fin.

Bruno.



OK, ca c'est acquis. Mais lire par la fin, comment je fais concrètement?
Ca pour ça j'ai moins besoin de performance.

Quelqu'un a un portion de code ?


Pas dans mon chapeau, mais tu peux utiliser java.io.RandomAccessFile et
écrire par dessus un reader qui part de la fin du fichier. Ca demande un peu
de travail, mais c'est faisable, et tu auras des perfs convenables.
L'intérêt de RandomAccessFile, comme son nom l'indique, c'est qu'il te
permet de te positionner arbitrairement dans un fichier, et donc par
exemple, de lire à partir de la fin.

Et si tu as besoin de faire d'autres types de lectures, des insertions un
peu complexes, etc. je te conseille de laisser tomber les fichiers (trop
rudimentaires) et d'utiliser une base de données ou une librairie de gestion
de fichiers séquentiels indexés (genre BTrieve). Ca gérera les détails de
bas niveau pour toi.

Bruno


Merci


merci

--

Comme disait ma grand-mère, "Parfois le chemin est long ..."







--

Comme disait ma grand-mère, "Parfois le chemin est long ..."






Avatar
niconews
"niconews" a écrit dans le message de news:
4247e9e4$0$28363$


"niconews" a écrit dans le message de news:
42472e0e$0$5160$




niconews - :




Bonjour,

je voudrais savoir comment je peux écrire en début d'un fichier, en
insérant en entete. En utilisant FileWriter et write, ça m'écrase tout.
Attention, le fichier initial est gros (20 à 30 Mo).

Autre solution : je sais écrire en fin d'un fichier (filewriter avec
option true) : je voudrais alors parcourir le fichier de la fin vers le
début : comment je fais un tel parcours ?

Merci par avance, c'est assez urgent.

Pensez à enlever nospam sur la réponse.





Tu renomes le fichier bidule existant en trucmuche.tmp
Tu crée un nouveau fichier bidule
Tu écrit ton entête dans bidule
Tu ouvres le fichier trucmuche
Tu écris le contenu du fichier trucmuche en ajout dans bidule
Tu fermes tout
Tu renommes trucmuche.tmp en bidule


alors, chez moi, trucmuche, fait 20 Mo et ca doit être actualisé toutes
les 30 secondes : mon écriture est faite toutes les 30 ''.

Ca risque pas faire beaucoup, le recopie toutes les 30'' de trucmuche à
la fin de bidule ?

Sinon, tu sais lire en java à partir de la fin ? genre readline mais dans
l'autre sens ?



Un fichier ça ne s'accède pas comme de la mémoire vive. En général, le
gestionnaire de fichiers peut facilement étendre un fichier par la fin,
mais n'a pas été conçu pour l'étendre par le début. C'est pour ça que les
bibliothèques d'I/O savent lire du début vers la fin et ajouter à la fin,
mais n'offrent en général pas de fonctions pour travailler dans l'autre
sens. Ces fonctions ne sont pas impossibles à implémenter mais elles
seraient terriblement inefficaces (pour insérer au début, il n'y a en
général pas d'autre choix que de faire les manips trucmuche/bidule
ci-dessus).

Donc, tu essaies de te battre contre l'OS. Il faut que tu repenses ta
solution, en intégrant la contrainte qu'un fichier, ça s'étend par la
fin.

Bruno.



OK, ca c'est acquis. Mais lire par la fin, comment je fais concrètement?
Ca pour ça j'ai moins besoin de performance.

Quelqu'un a un portion de code ?



Pas dans mon chapeau, mais tu peux utiliser java.io.RandomAccessFile et
écrire par dessus un reader qui part de la fin du fichier. Ca demande un peu
de travail, mais c'est faisable, et tu auras des perfs convenables.
L'intérêt de RandomAccessFile, comme son nom l'indique, c'est qu'il te
permet de te positionner arbitrairement dans un fichier, et donc par
exemple, de lire à partir de la fin.

Et si tu as besoin de faire d'autres types de lectures, des insertions un
peu complexes, etc. je te conseille de laisser tomber les fichiers (trop
rudimentaires) et d'utiliser une base de données ou une librairie de gestion
de fichiers séquentiels indexés (genre BTrieve). Ca gérera les détails de
bas niveau pour toi.



Justement pour éviter de solliciter mon réseaux et les accès JDBC, je
veux pas utiliser les BD c'est tout là le pb.

Merci

Bruno


Merci


merci

--

Comme disait ma grand-mère, "Parfois le chemin est long ..."






--

Comme disait ma grand-mère, "Parfois le chemin est long ..."







--

Comme disait ma grand-mère, "Parfois le chemin est long ..."






1 2