Super urgent : écrire en entete d'un fichier, ou lire à partir de la fin.
17 réponses
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 ..."
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
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
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
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 ..."
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 ..."
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 ..."
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
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
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 ..."
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 ..."
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 ..."
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 ..."
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.
"niconews" <niconews_nospam@free.fr> 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.
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.
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.
"niconews" <niconews_nospam@free.fr> a écrit dans le message de news:
424acf65$0$13622$636a15ce@news.free.fr...
"niconews" <niconews_nospam@free.fr> 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.
"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.