Necesito agregar texto repetidamente a un archivo existente en Java. ¿Cómo puedo hacer eso?
fuente
Necesito agregar texto repetidamente a un archivo existente en Java. ¿Cómo puedo hacer eso?
¿Estás haciendo esto para fines de registro? Si es así, hay varias bibliotecas para esto . Dos de los más populares son Log4j y Logback .
Si solo necesita hacer esto una vez, la clase Archivos lo hace fácil:
try {
Files.write(Paths.get("myfile.txt"), "the text".getBytes(), StandardOpenOption.APPEND);
}catch (IOException e) {
//exception handling left as an exercise for the reader
}
Cuidado : el enfoque anterior arrojará un NoSuchFileException
si el archivo aún no existe. Tampoco agrega una nueva línea automáticamente (que a menudo desea cuando se agrega a un archivo de texto). La respuesta de Steve Chambers cubre cómo podrías hacer esto con la Files
clase.
Sin embargo, si va a escribir en el mismo archivo muchas veces, lo anterior tiene que abrir y cerrar el archivo en el disco muchas veces, lo cual es una operación lenta. En este caso, un escritor protegido es mejor:
try(FileWriter fw = new FileWriter("myfile.txt", true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw))
{
out.println("the text");
//more code
out.println("more text");
//more code
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
Notas:
FileWriter
constructor le dirá que se agregue al archivo, en lugar de escribir un nuevo archivo. (Si el archivo no existe, se creará).BufferedWriter
Se recomienda usar a para un escritor costoso (como FileWriter
).PrintWriter
le da acceso a la println
sintaxis a la que probablemente esté acostumbrado System.out
.BufferedWriter
y PrintWriter
no son estrictamente necesarios.try {
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)));
out.println("the text");
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
Si necesita un manejo robusto de excepciones para Java más antiguo, se vuelve muy detallado:
FileWriter fw = null;
BufferedWriter bw = null;
PrintWriter out = null;
try {
fw = new FileWriter("myfile.txt", true);
bw = new BufferedWriter(fw);
out = new PrintWriter(bw);
out.println("the text");
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
finally {
try {
if(out != null)
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
try {
if(bw != null)
bw.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
try {
if(fw != null)
fw.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
}
new BufferedWriter(...)
arroja una excepción; ¿FileWriter
Se cerrará el? Supongo que no se cerrará, porque elclose()
método (en condiciones normales) se invocará en elout
objeto, que en este caso no se inicializará, por lo que en realidad elclose()
método no se invocará -> el archivo se abrirá, pero No se cerrará. Entonces, en mi humilde opinión, latry
declaración debería tener este aspecto ¡¡try(FileWriter fw = new FileWriter("myFile.txt")){ Print writer = new ....//code goes here }
Y debería hacerloflush()
el escritor antes de salir deltry
bloque !!!StandardOpenOption.APPEND
no lo creará, algo así como una falla silenciosa ya que tampoco arrojará una excepción. (2) El uso.getBytes()
significará que no hay caracteres de retorno antes o después del texto adjunto. He agregado una respuesta alternativa para abordar estos.Se puede usar
fileWriter
con una bandera establecida entrue
, para agregar.fuente
close
debe colocarse enfinally
bloque tal como se muestra en la respuesta de @etech en caso de que se produzca una excepción entre la creación de FileWriter y la invocación de cierre.try(FileWriter fw = new FileWriter(filename,true)){ // Whatever }catch(IOException ex){ ex.printStackTrace(); }
¿No deberían todas las respuestas aquí con bloques try / catch tener las piezas .close () contenidas en un bloque finalmente?
Ejemplo de respuesta marcada:
Además, a partir de Java 7, puede usar una declaración de prueba con recursos . No se requiere finalmente un bloque para cerrar los recursos declarados porque se maneja automáticamente y también es menos detallado:
fuente
out
sale del alcance, se cierra automáticamente cuando se recolecta basura, ¿verdad? En su ejemplo con elfinally
bloque, creo que realmente necesita otro try / catch anidadoout.close()
si no recuerdo mal. ¡La solución Java 7 es bastante ingeniosa! (No he estado haciendo cualquier dev Java desde Java 6, así que estaba familiarizado con ese cambio.)flush
método?Editar : a partir de Apache Commons 2.1, la forma correcta de hacerlo es:
Adapte la solución de @ Kip para incluir el cierre correcto del archivo finalmente:fuente
Para ampliar ligeramente la respuesta de Kip , aquí hay un método simple de Java 7+ para agregar una nueva línea a un archivo, creándolo si aún no existe :
Nota: Lo anterior usa la
Files.write
sobrecarga que escribe líneas de texto en un archivo (es decir, similar a unprintln
comando). Para escribir texto hasta el final (es decir, similar a unprint
comando),Files.write
se puede utilizar una sobrecarga alternativa , pasando una matriz de bytes (por ejemplo"mytext".getBytes(StandardCharsets.UTF_8)
).fuente
.CREATE
hace el trabajo por ti.Asegúrese de que la transmisión se cierre correctamente en todos los escenarios.
Es un poco alarmante cuántas de estas respuestas dejan el identificador de archivo abierto en caso de error. La respuesta https://stackoverflow.com/a/15053443/2498188 está en el dinero, pero solo porque
BufferedWriter()
no se puede lanzar. Si pudiera, una excepción dejaría elFileWriter
objeto abierto.Una forma más general de hacer esto que no le importa si
BufferedWriter()
puede lanzar:Editar:
A partir de Java 7, la forma recomendada es usar "probar con recursos" y dejar que la JVM se encargue de ello:
fuente
PrintWriter.close()
no se declara comothrows IOException
en los documentos . Mirando su fuente , elclose()
método, de hecho, no puede lanzarIOException
, porque lo atrapa del flujo subyacente y establece una bandera. Entonces, si está trabajando en el código para el próximo transbordador espacial o un sistema de medición de dosis de rayos X, debe usarloPrintWriter.checkError()
después de intentarloout.close()
. Esto realmente debería haber sido documentado.XX.close()
debería estar en su propio intento / captura, ¿verdad? Por ejemplo,out.close()
podría lanzar una excepción, en cuyo casobw.close()
yfw.close()
nunca sería llamado, yfw
es la que es más crítica para cerrar.En Java-7 también se puede hacer de este tipo:
// ---------------------
fuente
java 7+
En mi humilde opinión, ya que soy fanático de Java simple, sugeriría algo que es una combinación de las respuestas antes mencionadas. Tal vez llego tarde a la fiesta. Aquí está el código:
Si el archivo no existe, lo crea y, si ya existe, agrega el texto de muestra al archivo existente. Al usar esto, le ahorra agregar libs innecesarias a su classpath.
fuente
Esto se puede hacer en una línea de código. Espero que esto ayude :)
fuente
Usando java.nio. Archivos junto con java.nio.file. StandardOpenOption
Esto crea un
BufferedWriter
uso de archivos, que aceptaStandardOpenOption
parámetros, y un enjuague automáticoPrintWriter
del resultanteBufferedWriter
.PrintWriter
Elprintln()
método de, luego puede ser llamado para escribir en el archivo.Los
StandardOpenOption
parámetros utilizados en este código: abre el archivo para escribir, solo se agrega al archivo y crea el archivo si no existe.Paths.get("path here")
puede ser reemplazado connew File("path here").toPath()
. YCharset.forName("charset name")
se puede modificar para acomodar el deseadoCharset
.fuente
Solo agrego un pequeño detalle:
2.nd parámetro (verdadero) es una característica (o interfaz) llamada appendable ( http://docs.oracle.com/javase/7/docs/api/java/lang/Appendable.html ). Es responsable de poder agregar algún contenido al final de un archivo / secuencia en particular. Esta interfaz se implementa desde Java 1.5. Cada objeto (es decir , BufferedWriter, CharArrayWriter, CharBuffer, FileWriter, FilterWriter, LogStream, OutputStreamWriter, PipedWriter, PrintStream, PrintWriter, StringBuffer, StringBuilder, StringWriter, Writer ) con esta interfaz se puede utilizar para agregar contenido
En otras palabras, puede agregar algún contenido a su archivo comprimido o algún proceso http
fuente
Muestra, usando guayaba:
fuente
Intenta con bufferFileWriter.append, funciona conmigo.
fuente
esto hará lo que pretendes ..
fuente
Es mejor usar try-with-resources que todo ese pre-java 7 finalmente negocio
fuente
Si estamos utilizando Java 7 y superior y también sabemos el contenido que se agregará (adjuntará) al archivo, podemos utilizar el método newBufferedWriter en el paquete NIO.
Hay algunos puntos a tener en cuenta:
StandardCharsets
.try-with-resource
declaración en la que los recursos se cierran automáticamente después del intento.Aunque OP no ha preguntado, pero solo en caso de que queramos buscar líneas que tengan alguna palabra clave específica, por ejemplo
confidential
, podemos hacer uso de las API de transmisión en Java:fuente
write(String string)
si uno espera una nueva línea después de cada cadena escrita,newLine()
debe llamarseel verdadero permite agregar los datos en el archivo existente. Si vamos a escribir
Sobreescribirá el archivo existente. Así que ve por el primer acercamiento.
fuente
fuente
Luego tome una IOException en algún lugar aguas arriba.
fuente
Cree una función en cualquier parte de su proyecto y simplemente llame a esa función donde la necesite.
Chicos, deben recordar que ustedes están llamando hilos activos que no están llamando de forma asincrónica y ya que probablemente sería un buen 5 a 10 páginas para hacerlo bien. ¿Por qué no dedicar más tiempo a su proyecto y olvidarse de escribir cualquier cosa ya escrita? Correctamente
tres líneas de código dos realmente ya que la tercera realmente agrega texto. :PAGS
fuente
fuente
También puedes probar esto :
fuente
Podría sugerir el proyecto apache commons . Este proyecto ya proporciona un marco para hacer lo que necesita (es decir, filtrado flexible de colecciones).
fuente
El siguiente método le permite agregar texto a algún archivo:
Alternativamente usando
FileUtils
:No es eficiente pero funciona bien. Los saltos de línea se manejan correctamente y se crea un nuevo archivo si aún no existía.
fuente
Este código satisfará su necesidad:
fuente
En caso de que desee AGREGAR ALGUNOS TEXTOS EN LÍNEAS ESPECÍFICAS , primero puede leer el archivo completo, agregar el texto donde desee y luego sobrescribir todo, como en el siguiente código:
fuente
Mi respuesta:
fuente
fuente
Puede usar el código siguiente para agregar el contenido en el archivo:
fuente
1.7 Enfoque:
fuente