• No se han encontrado resultados

Escriba bytes en un archivo

In document Java soluciones de programación (página 83-86)

Componentes clave

Clases Métodos

java.io.FileOutputStream int write(int valbyte) void close( )

Como se estableció en la solución anterior, hay dos operaciones de archivo fundamentales: lectura y escritura de bytes en un archivo. En la solución anterior se mostró cómo leer bytes. En ésta se muestra cómo escribirlos. Aunque Java le ofrece la capacidad de escribir otros tipos de datos, la salida basada en bytes es útil en circunstancias en que deben escribirse datos simples (es decir, sin formato) en un archivo. Por ejemplo, si quiere guardar en disco el contenido de un búfer de pantalla, entonces la opción correcta es la salida basada en bytes. También es la opción correcta cuando se crean varias utilerías de archivo, como las de copia, división, mezcla o búsqueda de archivos, porque los operadores de archivos basados en bytes pueden usarse con cualquier tipo de archivo, sin importar lo que contenga o el formato de sus datos.

Para escribir bytes en un archivo, puede usar FileOutputStream. Se deriva de OutputStream, que define la funcionalidad básica de todos los flujos de salida de bytes. Implementa las interfaces Closeable y Flushable.

Paso a paso

Para escribir en un archivo empleando FileOutputStream, se requieren estos pasos: 1. Abra el archivo al crear un objeto de FileOutputStream.

2. Escriba en el archivo empleando el método write( ). 3. Cierre el archivo al llamar a close( ).

Análisis

A fi n de abrir un archivo para salida, cree un objeto de FileOutputStream, que defi ne varios constructores. El que usaremos es:

FileOutputStream(String nombreArchivo) throws FileNotFoundException

Aquí, nombreArchivo especifi ca el nombre del archivo que desea abrir. Si el archivo no puede crearse, entonces se lanza FileNotFoundException. Cualquier archivo existente que tenga el mismo nombre habrá de destruirse.

Para escribir en un archivo, puede usar cualquier versión del método write( ), que se hereda de OutputStream. Aquí se muestra su forma más simple:

void write(int valbyte) throws IOException

Con este método se escribe el byte especifi cado por valbyte en el archivo. Aunque valbyte se declara como entero, sólo se escriben los ocho bytes de orden inferior en el archivo. Lanzará una IOException si ocurre un error durante la escritura. Otras versiones de write( ) pueden dar salida a una matriz de bytes.

Cuando haya terminado con el archivo, debe cerrarlo al llamar a close( ). Aquí se muestra: void close( ) throws IOException

Se lanza una IOException si ocurre un error mientras se cierra el archivo.

Ejemplo

En el siguiente ejemplo se usa FileOutputStream para escribir bytes en un archivo. Primero crea un archivo llamado Prueba.dat. luego escribe cada tercer byte en la matriz vals, que contiene los códigos ASCII de la letra A a la J. Por tanto, después de que se ejecuta el programa, Prueba.dat contendrá los caracteres ASCII ACEGI.

// Usa FileOutputStream para escribir los bytes en un archivo. import java.io.*;

class EscribirBytes {

public static void main(String args[ ]) {

// Esta matriz contiene el código ASCII de la // letra A a la J.

FileOutputStream fout; try {

// Abre el archivo de salida.

fout = new FileOutputStream("Prueba.dat"); } catch(FileNotFoundException exc) {

System.out.println("Error al abrir el archivo de salida"); return;

} try {

// Escribe cada tercer valor de la matriz vals en el archivo. for(int i=0; i<vals.length; i+=2)

fout.write(vals[i]); } catch(IOException exc) {

System.out.println("Error al escribir el archivo"); }

try {

fout.close( );

} catch(IOException exc) {

System.out.println("Error al cerrar el archivo"); }

} }

Opciones

Hay otras dos formas de write( ) que puede usar para escribir bytes en un archivo. En primer lugar, puede escribir un bloque de bytes empleando esta forma de write( ):

void write(byte buf[ ]) throws IOException

El contenido de la matriz a la que hace referencia buf se escribe en el archivo. Por ejemplo, en el programa anterior, si quisiera escribir todo el contenido de la matriz vals en el archivo, podría usar esta simple llamada a write( ).

fout.write(vals)

Esto sería más efi ciente que escribir de byte en byte.

Puede escribir una parte de una matriz en un archivo al usar esta forma de write( ): void write(byte buf[ ], int indInicio, int num) throws IOException

Esta versión escribe un num de bytes de buf en un archivo, empezando en el índice especifi cado por indInicio.

FileOutputStream proporciona varios constructores adicionales. En primer lugar, puede especificar el archivo que se abrirá al pasar un objeto de File o uno de FileDescriptor. También puede especificar si la salida se adjuntará al final del archivo empleando uno de estos constructores:

FileOutputStream(String nombreArchivo, boolean adjunt)

throws FileNotFoundException

FileOutputStream(String objetoArchivo, boolean adjunt)

En la primera versión, nombreArchivo especifi ca el nombre del archivo que quiere abrir. En la segunda versión, objetoArchivo especifi ca el objeto de File que describe el archivo que quiere abrir. Si adjunt es true, entonces el contenido del archivo existente se conservará y toda la salida se escribirá al fi nal del archivo. Esto es útil cuando quiere agregar algo a un archivo existente. De otra manera, cuando adjunt es false, el contenido del archivo anterior, con el mismo nombre, se destruirá. En ambos casos, si no puede abrirse el archivo, se lanzará FileNotFoundException. Verá los efectos de abrir un archivo usando el modo de adjuntar si sustituye la línea en el ejemplo:

fout = new FileOutputStream("Prueba.dat", true);

Ahora, cada vez que ejecute el programa, los caracteres se agregarán al fi nal del contenido anterior de Prueba.dat.

Puede almacenar en búfer la salida a un archivo al envolver un FileOutputStream dentro de un BufferedOutputStream. (Consulte Use el búfer para la E/S de un archivo basada en bytes.)

Para escribir caracteres (es decir, objetos de tipo char) en lugar de bytes, use FileWriter. (Consulte Escriba caracteres en un archivo.)

In document Java soluciones de programación (página 83-86)