Escribir al comienzo de un archivo de texto Java

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;

Buenas tardes señor, ¿cómo está usted hoy?
¿Estoy bien cómo estás?
Gracias por preguntar, estoy genial

Después de modificar, quiero que sea así:

Página 1-Escena 59
25.05.2011

Buenas tardes señor, ¿cómo está usted hoy?
¿Estoy bien cómo estás?
Gracias por preguntar, estoy genial

Acabo de crear el contenido 🙂 ¿Cómo puedo modificar un archivo de texto de esta manera?

En realidad, no puede modificarlo de esa manera (los sistemas de archivos generalmente no le permiten insertar datos en ubicaciones arbitrarias), pero puede:

  • Crea un nuevo archivo
  • Escribe el prefijo a él
  • Copie los datos del archivo anterior al nuevo archivo
  • Mueva el archivo anterior a una ubicación de respaldo
  • Mueva el nuevo archivo a la ubicación del archivo anterior
  • Opcionalmente, elimine el archivo de copia de seguridad anterior

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 la biblioteca Apache Commons IO . 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); } 

Creo que lo que quieres es acceso aleatorio. Consulte el tutorial relacionado de Java . Sin embargo, no creo que pueda insertar datos en un punto arbitrario del archivo; Si recuerdo correctamente, solo sobrescribiría los datos. Si quisieras insertar, tendrías que tener tu código

  1. copia un bloque,
  2. sobrescribir con tus cosas nuevas,
  3. copia el siguiente bloque,
  4. sobrescribir con el bloque copiado previamente,
  5. vuelve a 3 hasta que no haya más bloques

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

Actualización: si no tienes problemas con FileUtils, utiliza

 String fileString = FileUtils.readFileToString(file); 

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

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