HOWTO · Java
Escribe un byte en un archivo en Java
Este artículo muestra cómo escribir un byte en un archivo en Java
En esta página
Este tutorial muestra cómo escribir un array de bytes en un archivo en Java. La biblioteca estándar ofrece dos opciones prácticas: un FileOutputStream para escrituras al estilo de flujo y el método Files.write() de NIO para una operación de una sola llamada; además, Apache Commons IO añade FileUtils.writeByteArrayToFile() como una comodidad para los proyectos que ya incluyen la dependencia. Todos los ejemplos convierten el texto a bytes con StandardCharsets.UTF_8 para que el archivo guardado no dependa del juego de caracteres predeterminado de la máquina.
Escribir un array de bytes con FileOutputStream
FileOutputStream es el flujo clásico orientado a bytes de java.io. Al construirlo con un nombre de archivo, crea el archivo cuando no existe y reemplaza el contenido de un archivo que ya está ahí; pasa true como segundo argumento del constructor cuando quieras añadir en su lugar. El flujo mantiene un identificador del sistema operativo, así que ciérralo cuando la escritura termine: el bloque try-with-resources realiza el cierre automáticamente.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import java.io.FileOutputStream;
import java.nio.charset.StandardCharsets;
class ByteToFile {
public static void main(String[] args) throws Throwable {
byte[] data = "DelftStack writes bytes".getBytes(StandardCharsets.UTF_8);
try (FileOutputStream out = new FileOutputStream("stream-demo.bin")) {
out.write(data);
}
System.out.println("Wrote " + data.length + " bytes to stream-demo.bin");
}
}
Wrote 23 bytes to stream-demo.bin
getBytes(StandardCharsets.UTF_8) codifica la cadena de forma determinista; llamar a getBytes() sin argumentos usa el juego de caracteres predeterminado de la plataforma y podría producir bytes distintos en otra máquina. write(data) guarda el array completo, mientras que write(data, offset, length) guarda solo una porción cuando la necesitas. Cuando el propio constructor falla —una ruta que nombra un directorio, un directorio padre que no existe o la falta de permiso de escritura— Java lanza una FileNotFoundException, así que elige un destino con permisos de escritura antes de abrir el flujo.
Escribir un array de bytes con Files.write()
La API java.nio.file comprime toda la operación en una sola llamada. Files.write() abre la ruta, escribe cada byte y cierra el archivo; de forma predeterminada crea el archivo cuando no existe y lo trunca cuando ya está presente. Pasa opciones de apertura como StandardOpenOption.APPEND para añadir o StandardOpenOption.CREATE_NEW para fallar cuando el archivo ya existe.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
class ByteToFileNio {
public static void main(String[] args) throws Throwable {
byte[] data = "NIO write sample data".getBytes(StandardCharsets.UTF_8);
Path target = Paths.get("nio-demo.bin");
Files.write(target, data);
System.out.println("Wrote " + data.length + " bytes to nio-demo.bin");
}
}
Wrote 21 bytes to nio-demo.bin
El método declara IOException, y sus fallos habituales son descriptivos: NoSuchFileException cuando falta un directorio padre, AccessDeniedException cuando el proceso no tiene permiso y FileAlreadyExistsException cuando pasas CREATE_NEW sobre un archivo existente. Elige Files.write() cuando quieras la forma más breve de la biblioteca estándar y no necesites el control del flujo abierto que ofrece FileOutputStream.
Escribir un array de bytes con Apache Commons IO
Los proyectos que ya dependen de Apache Commons IO pueden llamar a FileUtils.writeByteArrayToFile() en su lugar. Declara las coordenadas de Maven commons-io:commons-io con la versión que fije tu compilación; la versión original de este artículo mostraba 2.6, que es una versión de ejemplo suministrada y no una recomendación actual, así que comprueba la línea de versiones que pretendes usar.
Con org.apache.commons.io.FileUtils importado, la llamada es FileUtils.writeByteArrayToFile(new File("doc.txt"), data), donde data es cualquier byte[] como "text".getBytes(StandardCharsets.UTF_8). El método crea el archivo de destino cuando no existe, crea los directorios padre que falten en el camino —un paso que Files.write() no realiza— y trunca un archivo existente antes de escribir. También gestiona el flujo internamente, de modo que no queda ningún identificador que el llamador tenga que cerrar. Como la clase vive en un jar de terceros, este fragmento se muestra como fuente en lugar de un ejemplo ejecutable; para código nuevo sin la dependencia, Files.write() cubre la misma tarea en una línea.