Gestión de archivos en Java

Resuelto
sagon -  
 Martin -
Bonjour,
¿cómo se puede escribir en medio de un archivo con Java?

gracias de antemano

4 respuestas

KX Mensajes publicados 19031 Estado Moderador 3 020
 
¿Qué llamas "el medio"?
¿Qué quieres hacer exactamente?
--
La confianza no excluye el control.
0
arth Mensajes publicados 84 Fecha de registro   Estado Colaborador Última intervención   1 293
 
Creo que quiere hacer streaming del archivo, una especie de sed.
--

El lobo, solitario y misterioso.
0
KX Mensajes publicados 19031 Estado Moderador 3 020
 
No conocía el término de SEd, pero si es así, habrá que cargar el texto en una Colección, tal vez ArrayList<String>, hacer las operaciones sobre él y luego sobrescribir el texto.
En cualquier caso, no conozco en Java ningún flujo que permita al mismo tiempo la lectura (InputSream) y la escritura (OutputStream)
--
La confianza no excluye el control.
0
Martin
 
Bonjour Martin,

Pour enregistrer une nouvelle entrée dans un fichier texte sans écraser le contenu existant, vous pouvez ouvrir le `BufferedWriter` en mode ajout. Cela vous permettra d'écrire à la fin du fichier sans écraser les lignes déjà présentes. Voici comment vous pourriez modifier votre code :

```java
BufferedWriter fic = new BufferedWriter(new FileWriter(choix.getSelectedFile(), true)); // Le 'true' permet d'ouvrir en mode ajout
```

Cela vous évitera d'avoir besoin de lire le fichier existant dans un tableau auxiliaire avant de l'écrire, simplifiant ainsi votre processus.

Pour votre question sur la création du fichier, vous pouvez vérifier si le fichier existe déjà. Si ce n'est pas le cas, vous pouvez le créer :

```java
File file = choix.getSelectedFile();
if (!file.exists()) {
file.createNewFile();
}
```

Quant à la taille du tableau `String[]`, Java ne supporte pas les tableaux dynamiques comme Pascal. Vous pouvez utiliser une `ArrayList<string>` à la place, qui peut croître dynamiquement :

```java
ArrayList<string> aux = new ArrayList<>();
```

Finalement, voici une version modifiée de votre méthode :

```java
public void enreg_entree() {
String chaine1;
String chaine2;
String chaine3;
ArrayList<string> aux = new ArrayList<>();
chaine1 = textField1.getText();
chaine2 = jTextField1.getText();
chaine3 = jTextField2.getText();

try {
JFileChooser choix = new JFileChooser();
choix.showOpenDialog(new JFrame());
File file = choix.getSelectedFile();

if (!file.exists()) {
file.createNewFile();
}

BufferedReader lecteur = new BufferedReader(new FileReader(file));
String ligne;
while ((ligne = lecteur.readLine()) != null) {
aux.add(ligne);
}
lecteur.close();

BufferedWriter fic = new BufferedWriter(new FileWriter(file, true)); // Mode ajout
for (String ligneExistante : aux) {
fic.write(ligneExistante);
fic.newLine();
}
fic.write(chaine1);
fic.newLine();
fic.write(chaine2);
fic.newLine();
fic.write(chaine3);
fic.close();

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

Cela devrait répondre à vos attentes. N'hésitez pas si vous avez d'autres questions !</string></string></string>
0
KX Mensajes publicados 19031 Estado Moderador 3 020
 
El problema de sagon era agregar datos en medio del archivo, mientras que tú, si he entendido bien, podrías agregar tus datos al final del archivo sin problema con FileWriter(file,true);.

Para tu otra pregunta: el String[] es un poco pesado para manipular tus datos, sería mejor retomar lo que decía y usar una Collection.
0
Martin
 
¡Gracias por tu respuesta!
Estoy retomando poco a poco, así que es cierto que un archivo de texto tiene la ventaja de poder controlarse fácilmente. Pensaba en modificar el código para hacer un archivo de tipo registro (lo cual debe ser más eficiente). ¿Una colección es equivalente a un registro?
Probaré tu truco para escribir al final. ¡Gracias!
0
KX Mensajes publicados 19031 Estado Moderador 3 020
 
Una Colección es "equivalente" a un contenedor, como tu String[]. Por ejemplo, puedes hacer una ArrayList que te permite añadir tantas líneas como desees sin conocer de antemano el número de líneas, y acceder a ellas directamente como un arreglo.
0
Martin
 
De acuerdo, es mejor entonces cuando tenemos un número indefinido de entradas.
¡Voy a ponerme a trabajar en todo esto!
Gracias.
0