¿Cuál es la forma más sencilla de crear y escribir en un archivo (de texto) en Java?
1383
Tenga en cuenta que cada uno de los ejemplos de código a continuación puede arrojar IOException
. Los bloques Try / catch / finally se han omitido por brevedad. Consulte este tutorial para obtener información sobre el manejo de excepciones.
Tenga en cuenta que cada uno de los ejemplos de código a continuación sobrescribirá el archivo si ya existe
Crear un archivo de texto:
PrintWriter writer = new PrintWriter("the-file-name.txt", "UTF-8");
writer.println("The first line");
writer.println("The second line");
writer.close();
Crear un archivo binario:
byte data[] = ...
FileOutputStream out = new FileOutputStream("the-file-name");
out.write(data);
out.close();
Los usuarios de Java 7+ pueden usar la Files
clase para escribir en archivos:
Crear un archivo de texto:
List<String> lines = Arrays.asList("The first line", "The second line");
Path file = Paths.get("the-file-name.txt");
Files.write(file, lines, StandardCharsets.UTF_8);
//Files.write(file, lines, StandardCharsets.UTF_8, StandardOpenOption.APPEND);
Crear un archivo binario:
byte data[] = ...
Path file = Paths.get("the-file-name");
Files.write(file, data);
//Files.write(file, data, StandardOpenOption.APPEND);
"PrintWriter prints formatted representations of objects to a text-output stream. "
la respuesta de Bozho es más correcta, aunque parece engorrosa (siempre puedes envolverla en algún método de utilidad).writer.close()
debería estar en un bloque finalmenteEn Java 7 y superior:
Sin embargo, hay utilidades útiles para eso:
Tenga en cuenta también que puede usar a
FileWriter
, pero usa la codificación predeterminada, que a menudo es una mala idea; es mejor especificar la codificación explícitamente.A continuación se muestra la respuesta original anterior a Java 7
Consulte también: Lectura, escritura y creación de archivos (incluye NIO2).
fuente
close()
a cualquier transmisión envuelta alrededor de cualquier otra cerrará también todas las transmisiones internas.Si ya tiene el contenido que desea escribir en el archivo (y no se genera sobre la marcha), la
java.nio.file.Files
adición en Java 7 como parte de la E / S nativa proporciona la forma más simple y eficiente de lograr sus objetivos.Básicamente, crear y escribir en un archivo es solo una línea, ¡además una simple llamada al método !
El siguiente ejemplo crea y escribe en 6 archivos diferentes para mostrar cómo se puede usar:
fuente
fuente
output.close()
lanza IOExceptionAquí hay un pequeño programa de ejemplo para crear o sobrescribir un archivo. Es la versión larga, por lo que se puede entender más fácilmente.
fuente
Una forma muy sencilla de crear y escribir en un archivo en Java:
fuente
File.exists()/createNewFile()
código aquí es inútil y derrochador. El sistema operativo ya tiene que hacer exactamente lo mismo cuandonew FileWriter()
se crea. Estás obligando a que todo suceda dos veces.FileWriter
siguiente manera:new FileWriter(file.getAbsoluteFile(),true)
Utilizar:
El uso
try()
cerrará la transmisión automáticamente. Esta versión es corta, rápida (almacenada) y permite elegir la codificación.Esta característica se introdujo en Java 7.
fuente
StandardCharsets.UTF_8
cadena "constante" en lugar de la cadena "utf-8" (Esto evita fallas tipográficas)...new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8)...
-java.nio.charset.StandardCharsets
se introduce en Java 7Aquí estamos ingresando una cadena en un archivo de texto:
Podemos crear fácilmente un nuevo archivo y agregarle contenido.
fuente
Dado que el autor no especificó si requieren una solución para las versiones de Java que han sido EoL'd (tanto por Sun como por IBM, y estas son técnicamente las JVM más extendidas), y debido al hecho de que la mayoría de las personas parecen haber respondido pregunta del autor antes de que se especificara que es un archivo de texto (no binario) , he decidido proporcionar mi respuesta.
En primer lugar, Java 6 generalmente ha llegado al final de su vida útil, y dado que el autor no especificó que necesita compatibilidad heredada, supongo que automáticamente significa Java 7 o superior (Java 7 aún no es EoL'd por IBM). Entonces, podemos mirar directamente el tutorial de E / S de archivo: https://docs.oracle.com/javase/tutorial/essential/io/legacy.html
Oh, bueno, eso descarta java.io.File. Si no se puede escribir / agregar un archivo, es posible que ni siquiera pueda saber por qué.
Podemos seguir mirando el tutorial: https://docs.oracle.com/javase/tutorial/essential/io/file.html#common
Si tiene todas las líneas que escribirá (agregará) al archivo de texto de antemano , el enfoque recomendado es https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html# write-java.nio.file.Path-java.lang.Iterable-java.nio.charset.Charset-java.nio.file.OpenOption ...-
Aquí hay un ejemplo (simplificado):
Otro ejemplo (agregar):
Si desea escribir el contenido del archivo a medida que avanza : https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#newBufferedWriter-java.nio.file.Path-java .nio.charset.Charset-java.nio.file.OpenOption ...-
Ejemplo simplificado (Java 8 o superior):
Otro ejemplo (agregar):
Estos métodos requieren un esfuerzo mínimo por parte del autor y deben preferirse a todos los demás al escribir en archivos [text].
fuente
FileNotFoundException
que se lanza cuando falla la operación.Si desea tener una experiencia relativamente libre de dolor, también puede echar un vistazo al paquete IO de Apache Commons , más específicamente a la
FileUtils
clase .Nunca olvides consultar las bibliotecas de terceros. Joda-Time para la manipulación de la fecha, Apache Commons Lang
StringUtils
para las operaciones de cadena comunes y demás pueden hacer que su código sea más legible.Java es un gran lenguaje, pero la biblioteca estándar a veces es un poco de bajo nivel. Potente, pero de bajo nivel, no obstante.
fuente
FileUtils
esstatic void write(File file, CharSequence data)
. Ejemplo de uso:import org.apache.commons.io.FileUtils;
FileUtils.write(new File("example.txt"), "string with data");
.FileUtils
También tienewriteLines
, que toma unaCollection
de las líneas.Si por alguna razón desea separar el acto de crear y escribir, el equivalente de Java
touch
escreateNewFile()
hace una comprobación de existencia y crea un archivo atómicamente. Esto puede ser útil si desea asegurarse de que fue el creador del archivo antes de escribir en él, por ejemplo.fuente
touch
en el sentido general, sino más bien en su uso secundario común para crear un archivo sin escribir datos en él. El propósito documentado de touch es actualizar la marca de tiempo en el archivo. Crear el archivo si no existe es realmente el efecto secundario, y se puede deshabilitar con un interruptor.exists()/createNewFile()
secuencias son literalmente una pérdida de tiempo y espacio.Estas son algunas de las formas posibles de crear y escribir un archivo en Java:
Usando FileOutputStream
Usando FileWriter
Usando PrintWriter
Usando OutputStreamWriter
Para obtener más información, consulte este tutorial sobre Cómo leer y escribir archivos en Java .
fuente
FileWriter
niOutputStreamWriter
estar cerrado en un bloque finally?Utilizar:
fuente
la mejor manera es usar Java7: Java 7 presenta una nueva forma de trabajar con el sistema de archivos, junto con una nueva clase de utilidad: Archivos. Usando la clase Archivos, también podemos crear, mover, copiar, eliminar archivos y directorios; También se puede utilizar para leer y escribir en un archivo.
Escribir con FileChannel Si se trata de archivos grandes, FileChannel puede ser más rápido que el estándar IO. El siguiente código escribe String en un archivo usando FileChannel:
Escribir con DataOutputStream
Escribir con FileOutputStream
Veamos ahora cómo podemos usar FileOutputStream para escribir datos binarios en un archivo. El siguiente código convierte un String int bytes y escribe los bytes en un archivo usando un FileOutputStream:
Escriba con PrintWriter podemos usar un PrintWriter para escribir texto formateado en un archivo:
Escriba con BufferedWriter: use BufferedWriter para escribir una Cadena en un nuevo archivo:
agregue una cadena al archivo existente:
fuente
Creo que este es el camino más corto:
fuente
Para crear un archivo sin sobrescribir el archivo existente:
fuente
fuente
exists()/createNewFile()
secuencias son literalmente una pérdida de tiempo y espacio.fuente
exists()/createNewFile()
secuencias son literalmente una pérdida de tiempo y espacio.¡Una sola línea!
path
yline
son cadenasfuente
lines
. Si es unjava.lang.String
, entonces la llamadagetBytes()
producirá bytes usando la codificación predeterminada de la plataforma , que no es muy buena en el caso general.La forma más simple que puedo encontrar:
Probablemente solo funcionará para 1.7+.
fuente
Vale la pena probarlo para Java 7+:
Parece prometedor ...
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 pedido, 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
Lectura y escritura de archivos usando el flujo de entrada y salida:
fuente
Solo incluye este paquete:
Y luego puede usar este código para escribir el archivo:
fuente
En Java 8, use Archivos y rutas y use la construcción try-with-resources.
fuente
Hay algunas formas simples, como:
fuente
bw
Está sin usar.Incluso puede crear un archivo temporal utilizando una propiedad del sistema , que será independiente del sistema operativo que esté utilizando.
fuente
Usando la biblioteca de guayaba de Google, podemos crear y escribir en un archivo muy fácilmente.
El ejemplo crea un nuevo
fruits.txt
archivo en el directorio raíz del proyecto.fuente
Leer la colección con los clientes y guardarla en un archivo, con JFilechooser.
fuente
Hay al menos varias formas de crear un archivo y escribir en él:
Pequeños archivos (1.7)
Puede usar uno de los métodos de escritura para escribir bytes o líneas en un archivo.
Estos métodos se encargan de la mayor parte del trabajo, como abrir y cerrar la transmisión, pero no están destinados a manejar archivos grandes.
Escritura de archivos más grandes utilizando E / S de flujo en búfer (1.7)
El
java.nio.file
paquete admite E / S de canal, que mueve datos en búferes, sin pasar por algunas de las capas que pueden obstaculizar la E / S de flujo.Este enfoque es preferencial debido a su rendimiento eficiente, especialmente al completar una gran cantidad de operaciones de escritura. Las operaciones almacenadas tienen este efecto ya que no se requiere que llamen al método de escritura del sistema operativo para cada byte, lo que reduce las costosas operaciones de E / S.
Usando NIO API para copiar (y crear uno nuevo) un archivo con un Outputstream (1.7)
También hay métodos adicionales que permiten copiar todos los bytes de una secuencia de entrada a un archivo.
FileWriter (texto) (<1.7)
Escribe directamente en el archivo (menos rendimiento) y debe usarse solo cuando el número de escrituras es menor. Se usa para escribir datos orientados a caracteres en un archivo.
FileOutputStream (binario) (<1.7)
FileOutputStream está diseñado para escribir secuencias de bytes sin formato, como datos de imágenes.
Con este enfoque, se debe considerar escribir siempre una matriz de bytes en lugar de escribir un byte a la vez. La aceleración puede ser bastante significativa: hasta 10 veces más o más. Por lo tanto, se recomienda utilizar los
write(byte[])
métodos siempre que sea posible.fuente