txt texto sobreescribir por notas modificar linea leer guardar ejemplo datos crear como bloc archivos archivo java file file-io filesystems

sobreescribir - Insertar texto en un archivo existente a través de Java



printwriter java ejemplo (7)

Me gustaría crear un programa simple (en Java) que edite archivos de texto, particularmente uno que realice la inserción de fragmentos arbitrarios de texto en posiciones aleatorias en un archivo de texto. Esta característica es parte de un programa más grande que estoy escribiendo actualmente.

Al leer la descripción sobre java.util.RandomAccessFile, parece que cualquier operación de escritura realizada en el medio de un archivo en realidad sobrescribirá el contenido que sale. Este es un efecto secundario que me gustaría evitar (si es posible).

¿Hay una manera simple de lograr esto?

Gracias por adelantado.


Bueno, no, no creo que exista una forma de evitar sobrescribir el contenido existente con una única API API Java IO estándar.

Si los archivos no son demasiado grandes, simplemente lea todo el archivo en una ArrayList (una entrada por línea) y reescriba las entradas o inserte nuevas entradas para las nuevas líneas.

Luego, sobrescriba el archivo existente con contenido nuevo o mueva el archivo existente a una copia de seguridad y escriba un nuevo archivo.

Dependiendo de cuán sofisticadas deben ser las ediciones, su estructura de datos puede necesitar cambios.

Otro método sería leer los caracteres del archivo existente mientras se escribe en el archivo editado y editar la secuencia tal como se lee.


Creo que la única forma de insertar texto en un archivo de texto existente es leer el archivo original y escribir el contenido en un archivo temporal con el nuevo texto insertado. A continuación, borre el archivo original y cambie el nombre del archivo temporal por el nombre original.

Este example se centra en insertar una sola línea en un archivo existente, pero aún así puede que sea útil para usted.


De acuerdo, esta pregunta es bastante antigua, pero existen FileChannels desde Java 1.4 y no sé por qué no se mencionan en ninguna parte cuando se trata del problema de reemplazar o insertar contenido en archivos. FileChannels es rápido, FileChannels .

Aquí hay un ejemplo (ignorando excepciones y algunas otras cosas):

public void insert(String filename, long offset, byte[] content) { RandomAccessFile r = new RandomAccessFile(new File(filename), "rw"); RandomAccessFile rtemp = new RandomAccessFile(new File(filename + "~"), "rw"); long fileSize = r.length(); FileChannel sourceChannel = r.getChannel(); FileChannel targetChannel = rtemp.getChannel(); sourceChannel.transferTo(offset, (fileSize - offset), targetChannel); sourceChannel.truncate(offset); r.seek(offset); r.write(content); long newOffset = r.getFilePointer(); targetChannel.position(0L); sourceChannel.transferFrom(targetChannel, newOffset, (fileSize - offset)); sourceChannel.close(); targetChannel.close(); }


No sé si hay una forma práctica de hacerlo directamente de otra manera que

  • lea el comienzo del archivo y escríbalo en el destino
  • escribe tu nuevo texto al objetivo
  • lea el resto del archivo y escríbalo en el destino.

Acerca del objetivo: puede construir los nuevos contenidos del archivo en la memoria y luego sobrescribir el contenido anterior del archivo si los archivos manejados no son tan grandes. O puede escribir el resultado en un archivo temporal.

Lo más probable es que sea más fácil hacer con las secuencias, RandomAccessFile no parece estar destinado a insertarse en el medio (afaik). Verifique el tutorial si lo necesita.


Puede usar el siguiente código:

BufferedReader reader = null; BufferedWriter writer = null; ArrayList list = new ArrayList(); try { reader = new BufferedReader(new FileReader(fileName)); String tmp; while ((tmp = reader.readLine()) != null) list.add(tmp); OUtil.closeReader(reader); list.add(0, "Start Text"); list.add("End Text"); writer = new BufferedWriter(new FileWriter(fileName)); for (int i = 0; i < list.size(); i++) writer.write(list.get(i) + "/r/n"); } catch (Exception e) { e.printStackTrace(); } finally { OUtil.closeReader(reader); OUtil.closeWriter(writer); }


Si Java tiene acceso a los archivos de mapas de memoria, lo que puede hacer es extender el archivo a su nueva longitud, mapear el archivo, eliminar todos los bytes hasta el final para hacer un agujero y escribir los datos nuevos en el agujero.

Esto funciona en C. Nunca lo probé en Java.

Otra forma en que pensé hacer lo mismo pero con acceso aleatorio a archivos.

  • Busque hasta el final - 1 MB
  • Leer 1 MB
  • Escríbalo en la posición original + tamaño del espacio.
  • Repita para cada 1 MB anterior trabajando hacia el comienzo del archivo.
  • Deténgase cuando llegue a la posición de espacio deseado.

Utilice un tamaño de búfer más grande para un rendimiento más rápido.


Si se trata de un archivo de texto ,,,, lea el archivo existente en StringBuffer y añada el nuevo contenido en el mismo StringBuffer, ahora puede escribir el SrtingBuffer en el archivo. así que ahora el archivo contiene tanto el texto existente como el nuevo.