2011-05-25 25 views
8

Necesito escribir algo en el comienzo de un archivo de texto. Tengo un archivo de texto con contenido y quiero escribir algo antes de este contenido. Di que tengo;Escribiendo al comienzo de un archivo de texto Java

Buena tardes señor, ¿cómo estás hoy?
Estoy bien, ¿cómo estás?
Gracias por preguntar, soy grande

Tras la modificación, que quieren que sea así:

Página 1-Escena 59
25.05.2011

Buena tardes señor ,¿cómo estás hoy?
Estoy bien, ¿cómo estás?
Gracias por preguntar, soy grande

acaba de hacer el contenido :) ¿Cómo puedo modificar un archivo de texto como de esta manera?

+0

@Turuko Lo primero que debe identificar es un delimitador. Sin delimitadores (ya sean explícitos o implícitos) no puede lograr su objetivo. Esto se entiende más fácilmente al hacerse esta pregunta, "¿Cómo sabré cuándo insertar el encabezado de página y escena sobre el cuadro de diálogo?" Si no tiene forma de determinar dónde se encuentra en el archivo de texto, entonces no puede hacerlo. –

+2

@Matthew: No veo el problema aquí, es escribir un fragmento de texto fijo al principio del archivo de texto. No hay necesidad de reconocer nada, al menos en lo que se refiere a la pregunta. –

+0

@Jon Tal vez malentendí la pregunta. Entendí que la pregunta era: "Tengo este archivo de texto, cómo puedo modificarlo para agregar este metadato entre ciertas secciones del archivo". –

Respuesta

20

Realmente no se puede modificar de esa manera - los sistemas de archivos por lo general no permiten insertar datos en ubicaciones arbitrarias - pero usted puede:

  • Crear un nuevo archivo
  • Escribe el prefijo a ella
  • Copiar los datos desde el archivo antiguo al nuevo archivo
  • mover el archivo de edad en una ubicación de copia de seguridad
  • Mueva el nuevo archivo a la ubicación del archivo antiguo de
  • eliminar Opcionalmente, el archivo de copia de seguridad antigua
+0

Esto parece algo factible para mi pregunta. Gracias por responder. Muy apreciado. Voy a entrar en eso. – toruko

+0

¿Es este proceso una gran pérdida de recursos? Estoy buscando una implementación rentable. – Poutrathor

+0

@Poutrathor: ¿Qué quiere decir con exactamente "rentable"? (Eso es lo mismo que "eficiente" si la ineficiencia tiene un costo real). Básicamente, si desea poder realizar inserciones/eliminaciones aleatorias, probablemente no desee almacenarlo como un archivo de texto sin formato ... –

2

Creo que lo que desea es de acceso aleatorio. Consulte el related java tutorial. Sin embargo, no creo que pueda insertar datos en un punto arbitrario del archivo; Si recuerdo correctamente, solo sobrescribiría los datos. Si se desea introducir, usted tiene que tener su código

  1. copia un bloque,
  2. sobrescribir con su nuevo material,
  3. copiar el siguiente bloque,
  4. sobrescribir con el bloque previamente copiado ,
  5. retorno a 3 hasta que no hay más bloques
+1

El acceso aleatorio generalmente le permite * sobrescribir * datos en puntos arbitrarios, no * insertar * datos dentro de un archivo. –

+0

Jon, sí, estaba en el medio de editar mi respuesta mientras comentabas :) – atk

2

Como sugirió @atk, java.nio.channels.SeekableByteChannel es una buena interfaz. Pero está disponible solo desde 1.7.

Actualización: Si no tiene ningún problema usando FileUtils a continuación, utilizar

String fileString = FileUtils.readFileToString(file); 
0

Esta no es una respuesta directa a la pregunta, pero a menudo se accede a los archivos a través InputStreams. Si este es su caso de uso, puede encadenar flujos de entrada a través del SequenceInputStream para lograr el mismo resultado. P.ej.

InputStream inputStream = new SequenceInputStream(new ByteArrayInputStream("my line\n".getBytes()), new FileInputStream(new File("myfile.txt"))); 
3

Sólo en caso de que sea útil para alguien aquí está el código fuente completo del método para anteponer líneas a un archivo usando Apache Commons IO biblioteca. El código no lee el archivo completo en la memoria, por lo que funcionará en archivos de cualquier tamaño.

public static void prependPrefix(File input, String prefix) throws IOException { 
    LineIterator li = FileUtils.lineIterator(input); 
    File tempFile = File.createTempFile("prependPrefix", ".tmp"); 
    BufferedWriter w = new BufferedWriter(new FileWriter(tempFile)); 
    try { 
     w.write(prefix); 
     while (li.hasNext()) { 
      w.write(li.next()); 
      w.write("\n"); 
     } 
    } finally { 
     IOUtils.closeQuietly(w); 
     LineIterator.closeQuietly(li); 
    } 
    FileUtils.deleteQuietly(input); 
    FileUtils.moveFile(tempFile, input); 
} 
Cuestiones relacionadas