Gestion du fichier en java

[Résolu/Fermé]
Signaler
-
 Martin -
Bonjour,
comment peut on écrire au milieu d'un fichier avec java


merci d'avance

4 réponses

Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 858
Qu'est-ce que tu appelles "le milieu" ?
Qu'est-ce que tu veux faire exactement ?
Messages postés
9367
Date d'inscription
mardi 27 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2016
1 330
Je pense qu'il veut faire du streaming sur le fichier, un genre de sed quoi.
Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 858
Je ne connaissais pas le terme de SEd, mais si c'est ça, il va falloir charger le texte dans une Collection, peut-être ArrayList<String>, faire les opérations dessus puis écraser le texte.
En tout cas je ne connais pas, en Java, de flux qui permettent en même temps la lecture (InputSream) et l'écriture (OutputStream)
Bonjour,
Je reprends doucement la programmation et tombe un peu sur la même interrogation pour gérer/compléter un fichier sans l'écraser systématiquement.
J'ai fait un petit programme qui recense mes demandes de stage (trois champs string genre nom_de_la_boite, activité, et informations_diverses) et me permet de les reconsulter ultérieurement.
Pour commencer doucement, j'ai choisit d'écrire chaque entrée dans un fichier texte en trois lignes (une pour chaque champ).
Dans ma procédure pour enregistrer une nouvelle entrée j'ai donc le problème de compléter un fichier existant et j'utilise un tableau auxiliaire type String[] pour sauvegarder ce qui est deja ecrit sur le fichier car mes autres tentatives de lire et écrire en même temps sont vouées à l'échec puisque le fichier recréé écrase systématiquement (new filereader (meme nom de fichier) l'ancien et son contenu.

public void enreg_entree() {
String chaine1;
String chaine2;
String chaine3;
String[] aux = new String[100];
int i=0;
chaine1= textField1.getText();
chaine2=jTextField1.getText();
chaine3=jTextField2.getText();
try {
JFileChooser choix = new JFileChooser(); // Boite de dialogue pour sélectionner le fichier à completer
choix.showOpenDialog(new JFrame());
FileReader fichier_existant = new FileReader (choix.getSelectedFile());
lit_fichier_existant(fichier_existant, aux); // Lit le fichier à completer et enregistre chaque ligne dans un String[]
BufferedWriter fic = new BufferedWriter(new FileWriter(choix.getSelectedFile())); // Crée le "même" fichier
while (aux[i]!=null) {
fic.write(aux[i]); // Ecriture des lignes sauvegardées dans le String[]
fic.newLine();
i++;
}
fic.write(chaine1); // Ecrit la éléments nouvelle entrée
fic.newLine();
fic.write(chaine2);
fic.newLine();
fic.write(chaine3);
fic.close();

}
catch (java.io.IOException exep) {
System.out.println("erreur"+ exep);
}}

Ca fonctionne mais je ne suis pas sur que ce soit la meilleure façon de procéder.
Y'a-t-il une astuce pour "parer le sens unique" du stream ?
D'autant que en lecture du coup, on ne peut pas créer le fichier en tapant un nom de fichier inexistant dans la dialogue box, si ?
Aussi, est-il possible de ne pas spécifier la longueur du String[], il me semble que c'était possible en Pascal (c'est avec ca que j'avais fait mes bases) ?
Ne tiquez pas trop sur la syntaxe, notamment le gros bloque try/catch qui englobe tout !
D'avance, merci pour vos réponse !
Martin
Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 858
Le problème de sagon était de rajouter des données au milieu du fichier, or toi si j'ai bien compris tu pourrais rajouter tes données à la fin du fichier sans problème avec FileWriter(file,true);.

Pour ton autre question : le String[] est un peu lourd pour manipuler tes données, il faudrait plutôt reprendre ce que je disais et utiliser une Collection.
Merci de ta réponse !
Je reprends doucement aors c'est vrai qu'un fichier texte présente l'avantage de se contrôler facilement, je pensais modifier le code pour faire un fichier de type enregistrement (ce qui doit être plus efficace), une collection c'est équivalent à un enregistrement ?
Je testerai ton astuce pour ecrire à la fin ! merci
Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 858
Une Collection c'est "équivalent" à un conteneur, comme ton String[]. Tu peux par exemple faire une ArrayList<String> qui te permetde rajouter autant de lignes que tu veux sans connaître à l'avance le nombre de lignes, et y accéder directement comme un tableau.
Ok, c'est mieux du coup quand on a un nombre d'entrées indéfini !
Je vais me pencher sur tout ca !
Merci