OVH Cloud OVH Cloud

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 ..."

7 réponses

1 2
Avatar
Alain
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.


attention à pas faire pire que la solution BD... ce serais bête de
remplacer un accès JDBC avec quelques requêtes bien concues et de petits
échanges, par un bricolage mal optimisé et des mega-octets chargés via
le réseau...

sinon une idée si tu écrit des volumes importants mais en nombre réduit,
tu peux essayer de créer 2 fichiers, un fichier données et un fichier
index...

tu accède a l'index assez brutalement et dans l'index tu as une position
dans le fichier données, auquel tu accède en mode random.

ca reproduit ce que fait une BD... sinon peut être as tu une
bibliothèque style Btree, ISAM, DBM qui existe


la question ici c'est de ca voir précisément la question que tu pose, et
pas celle que tu compte poser avec une idée préconcuie de l'algorithme...

car si ca se trouve avec de bons index et une structure de données
différente tout est simple

Avatar
niconews

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.



attention à pas faire pire que la solution BD... ce serais bête de
remplacer un accès JDBC avec quelques requêtes bien concues et de petits
échanges, par un bricolage mal optimisé et des mega-octets chargés via
le réseau...

sinon une idée si tu écrit des volumes importants mais en nombre réduit,
tu peux essayer de créer 2 fichiers, un fichier données et un fichier
index...


ben au contraire, je dois écrire très souvent (toutes les 20 '') mais qq
octets. Donc plein d'accès en base, ce qui sera pénalisant.

Alors que la lecture du fichier, je la ferait plus tard en batch, le soir.

Je pense que Bd=Mauvaise idée dans mon cas.


tu accède a l'index assez brutalement et dans l'index tu as une position
dans le fichier données, auquel tu accède en mode random.

ca reproduit ce que fait une BD... sinon peut être as tu une
bibliothèque style Btree, ISAM, DBM qui existe




la question ici c'est de ca voir précisément la question que tu pose, et
pas celle que tu compte poser avec une idée préconcuie de l'algorithme...

car si ca se trouve avec de bons index et une structure de données
différente tout est simple




--

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


Avatar
Sfeabg
Salut j'ai été confronté au pb que tu rencontres.

Pour chaque fichier je devais ajouter des lignes d'entête et une fin de
fichier (en gros ajouter une structure xml.)

je te mets le code tel que en espérant que cela puisse t'aider.

int count = 0;
byte[] bytes = new byte[1024];

try {
BufferedInputStream fic = new BufferedInputStream(new
FileInputStream("D:/monFichier.txt"));

OutputStreamWriter out new OutputStreamWriter(
new BufferedOutputStream(
new FileOutputStream("D:/monFichier.xml")), "8859_1");

out.write("<?xml version="1.0" "); //
ici on ajoute les lignes au début du fichier
out.write("encoding="ISO-8859-1"?>rn");
out.write("<racine>rn");

while (( count = fic.read(bytes)) != -1) { //
on ajoute le contenu du fichier existant
System.out.println(fic.read(bytes, 0, count));
//out.write(count+"rn");
}

out.write("</racine>rn");
// on ajoute la fin du fichier
System.out.println ("Le fichier a ete cree !");
out.flush();
out.close();
fic.close();

}catch (Exception e) {
e.printStackTrace();
}

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Avatar
niconews
Salut j'ai été confronté au pb que tu rencontres.

Pour chaque fichier je devais ajouter des lignes d'entête et une fin de
fichier (en gros ajouter une structure xml.)

je te mets le code tel que en espérant que cela puisse t'aider.

int count = 0;
byte[] bytes = new byte[1024];

try {
BufferedInputStream fic = new BufferedInputStream(new
FileInputStream("D:/monFichier.txt"));

OutputStreamWriter out > new OutputStreamWriter(
new BufferedOutputStream(
new FileOutputStream("D:/monFichier.xml")), "8859_1");

out.write("<?xml version="1.0" "); //
ici on ajoute les lignes au début du fichier
out.write("encoding="ISO-8859-1"?>rn");
out.write("<racine>rn");

while (( count = fic.read(bytes)) != -1) { //
on ajoute le contenu du fichier existant
System.out.println(fic.read(bytes, 0, count));
//out.write(count+"rn");
}

out.write("</racine>rn");
// on ajoute la fin du fichier
System.out.println ("Le fichier a ete cree !");
out.flush();
out.close();
fic.close();

}catch (Exception e) {
e.printStackTrace();
}



je prends, merci !

--

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

Avatar
niconews
Salut j'ai été confronté au pb que tu rencontres.

Pour chaque fichier je devais ajouter des lignes d'entête et une fin de
fichier (en gros ajouter une structure xml.)

je te mets le code tel que en espérant que cela puisse t'aider.

int count = 0;
byte[] bytes = new byte[1024];

try {
BufferedInputStream fic = new BufferedInputStream(new
FileInputStream("D:/monFichier.txt"));

OutputStreamWriter out > new OutputStreamWriter(
new BufferedOutputStream(
new FileOutputStream("D:/monFichier.xml")), "8859_1");

out.write("<?xml version="1.0" "); //
ici on ajoute les lignes au début du fichier
out.write("encoding="ISO-8859-1"?>rn");
out.write("<racine>rn");

while (( count = fic.read(bytes)) != -1) { //
on ajoute le contenu du fichier existant
System.out.println(fic.read(bytes, 0, count));
//out.write(count+"rn");
}

out.write("</racine>rn");
// on ajoute la fin du fichier
System.out.println ("Le fichier a ete cree !");
out.flush();
out.close();
fic.close();

}catch (Exception e) {
e.printStackTrace();
}



en complément, effectivement, ca marche, mais mon fichier initial me
semble trop grop (20 Mo) pour le lire à chaque fois (toutes les 30 ")
Merci quand même.

--

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

Avatar
niconews
"niconews" a écrit dans le message de news:

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.



Pour info, j'ai pris cette option, je suis en train de la finaliser.
Donc mon choix : j'écris à la fin d'un fichier, et je lis ce fichier à
partir de la fin.

Ca fonctionne, encore 1 ou 2 modifs et je vous copie le code.

Merci.

Avatar
Bruno Jouhier
"niconews" a écrit dans le message de news:
424acf65$0$13622$
"niconews" a écrit dans le message de news:

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.



Pour info, j'ai pris cette option, je suis en train de la finaliser.
Donc mon choix : j'écris à la fin d'un fichier, et je lis ce fichier à
partir de la fin.

Ca fonctionne, encore 1 ou 2 modifs et je vous copie le code.


Merci.

L'option écrire l'entête + recopier la totalité du fichier me semblait à
rejeter. C'est le genre de hack facile qui explose dès qu'on doit en faire
une utilisation réelle. A la rigueur, c'est acceptable si on doit ajouter
une entête une seule fois, mais si on doit faire des ajouts réguliers, ce
qui est ton cas, je pense qu'il faut faire quelque chose de plus performant
et que tu as raison de choisir cette voie.

Bruno.


Merci.



1 2