¿Hay alguna manera de anteponer una línea al archivo en Java, sin crear un archivo temporal y escribirle el contenido necesario?Anteponer líneas al archivo en Java
Respuesta
No, no hay forma de hacerlo SAFELY en Java.
Ninguna implementación de sistema de archivos en ningún sistema operativo principal admite este tipo de cosas, y no encontrará esta característica admitida en ninguno de los principales lenguajes de programación.
Los sistemas de archivos del mundo real se implementan en dispositivos que almacenan datos como "bloques" de tamaño fijo. No es posible implementar un modelo de sistema de archivos donde puede insertar bytes en el medio de un archivo sin ralentizar significativamente la E/S de archivos, desperdiciando espacio en el disco o ambos.
Las soluciones que implican una reescritura en el lugar del archivo son inherentemente inseguras. Si se mata a su aplicación o la energía muere en el medio del proceso de anteponer/reescribir, es probable que pierda datos. NO recomendaría usar ese enfoque en la práctica.
Use un archivo temporal. Es mas seguro.
Puede almacenar el contenido del archivo en una Cadena y anteponer la línea deseada utilizando un StringBuilder-Object. Solo tiene que poner la línea deseada primero y luego anexar el archivo-contenido-Cadena.
No se necesita ningún archivo temporal adicional.
Eso reemplazaría el contenido del archivo existente con el nuevo. No cambiaría el archivo en su lugar moviendo el contenido en el sistema de archivos y poniendo contenido nuevo antes, que es lo que hizo la pregunta. – jwenting
No. No hay operaciones de "desplazamiento entre archivos", solo lectura y escritura de tamaños discretos.
Sería posible hacerlo leyendo un fragmento del archivo de la misma longitud que lo que desea anteponer, escribiendo el nuevo contenido en su lugar, leyendo el fragmento posterior y reemplazándolo con lo que leyó antes, y así sucesivamente, ondulando hacia abajo hasta el final del archivo.
Sin embargo, no hagas eso, porque si algo se detiene (falta de memoria, corte de energía, hilo falso que llama al System.exit
) en el medio de ese proceso, se perderán los datos. Use el archivo temporal en su lugar.
Hay una manera, implica reescribir todo el archivo sin embargo (pero ningún archivo temporal). Como otros mencionaron, ningún sistema de archivos admite contenido pre-agregado a un archivo. Aquí hay un código de ejemplo que utiliza un RandomAccessFile para escribir y leer el contenido, manteniendo algunos contenidos en la memoria tampón:
public static void main(final String args[]) throws Exception {
File f = File.createTempFile(Main.class.getName(), "tmp");
f.deleteOnExit();
System.out.println(f.getPath());
// put some dummy content into our file
BufferedWriter w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f)));
for (int i = 0; i < 1000; i++) {
w.write(UUID.randomUUID().toString());
w.write('\n');
}
w.flush();
w.close();
// append "some uuids" to our file
int bufLength = 4096;
byte[] appendBuf = "some uuids\n".getBytes();
byte[] writeBuf = appendBuf;
byte[] readBuf = new byte[bufLength];
int writeBytes = writeBuf.length;
RandomAccessFile rw = new RandomAccessFile(f, "rw");
int read = 0;
int write = 0;
while (true) {
// seek to read position and read content into read buffer
rw.seek(read);
int bytesRead = rw.read(readBuf, 0, readBuf.length);
// seek to write position and write content from write buffer
rw.seek(write);
rw.write(writeBuf, 0, writeBytes);
// no bytes read - end of file reached
if (bytesRead < 0) {
// end of
break;
}
// update seek positions for write and read
read += bytesRead;
write += writeBytes;
writeBytes = bytesRead;
// reuse buffer, create new one to replace (short) append buf
byte[] nextWrite = writeBuf == appendBuf ? new byte[bufLength] : writeBuf;
writeBuf = readBuf;
readBuf = nextWrite;
};
rw.close();
// now show the content of our file
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
vacío addPreAppnedText (archivo Nombre de archivo) private static {
FileOutputStream FileOutputStream = null;
BufferedReader br = null;
FileReader fr = null;
String newFileName = fileName.getAbsolutePath() + "@";
try {
fileOutputStream = new FileOutputStream(newFileName);
fileOutputStream.write("preappendTextDataHere".getBytes());
fr = new FileReader(fileName);
br = new BufferedReader(fr);
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null) {
fileOutputStream.write(("\n"+sCurrentLine).getBytes());
}
fileOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileOutputStream.close();
if (br != null)
br.close();
if (fr != null)
fr.close();
new File(newFileName).renameTo(new File(newFileName.replace("@", "")));
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
- 1. Cómo anteponer # al principio de varias líneas con emacs?
- 2. Línea de anteponer al comienzo de un archivo
- 3. Anteponer una línea a un archivo existente en Python
- 4. Unix: anteponer un archivo sin un archivo ficticio?
- 5. anteponer NSString?
- 6. Cómo anteponer un tr al primer tr en una tabla?
- 7. ¿Es posible anteponer datos a un archivo sin reescribir?
- 8. ¿Cómo puedo omitir líneas al sorber un archivo en Perl?
- 9. Eliminación de líneas duplicadas en un archivo usando Java
- 10. jQuery: ¿Por qué anteponer un $ al nombre de la variable?
- 11. Anteponer nombres de archivo con el signo más
- 12. Linux para anteponer los datos de un archivo a otro
- 13. Java: lea las últimas n líneas de un archivo ENORME
- 14. cómo agregar líneas al archivo existente usando python
- 15. java nio líneas de lectura de un archivo
- 16. XmlReader - problema al leer el archivo xml sin líneas nuevas
- 17. Buscar una cadena en un archivo y escribir las líneas coincidentes a otro archivo en Java
- 18. archivo de propiedades Java usando múltiples líneas de una propiedad
- 19. Notepad ++ RegEx Search/Replace: ¿Cómo agregar y anteponer un carácter al inicio y al final de cada línea de archivo?
- 20. Java 7 - líneas múltiples
- 21. Hibernate falla al anteponer nombre de clase completamente calificado al nombre de propiedad en asociación ManyToMany
- 22. Crear y escribir líneas en un archivo
- 23. Acceso de Java al archivo grande
- 24. Dibujar líneas sobre varios paneles en Java
- 25. Agregar líneas a un archivo
- 26. ordenando líneas de un enorme archivo.txt en java
- 27. Es echo atomic al escribir líneas simples
- 28. C++ escribir al frente del archivo
- 29. Cómo escanear un archivo con antivirus al cargarlo en Java?
- 30. Lectura y escritura desde y al mismo archivo en Java
Tiene toda la razón sobre la inseguridad. No sé por qué no mencioné eso. – BalusC