Escritura y Lectura de Archivos (Flujos de Datos)
La escritura y lectura de archivos en Java se pueden realizar con un manejo muy similar al de las salidas y entradas estándar. Java provee clases específicas para gestionar estas operaciones:
- Para representar un archivo o directorio: La clase
File
. - Para lectura y escritura en archivos de texto (caracteres):
FileReader
yFileWriter
. - Para lectura y escritura en archivos binarios (bytes):
FileInputStream
yFileOutputStream
.
La Clase File
La clase File
permite representar un archivo o directorio dentro del sistema de archivos. Esta clase provee información acerca del archivo o directorio en disco (metadatos).
Es importante notar que la clase File
no abre archivos ni proporciona servicios para procesar su contenido. Su función es la gestión de la ruta y las propiedades del recurso.
Al crear un objeto de la clase File
, es necesario indicar el nombre del archivo o su ruta. Si solo se proporciona el nombre, Java intentará encontrar el archivo en el directorio donde se ejecuta la aplicación. La clase File
pertenece al paquete java.io
.
Métodos Principales de la Clase File
File(String pathname)
: Constructor que crea un objetoFile
abriendo el archivo especificado en el parámetro.boolean canExecute()
: Retornatrue
si la aplicación puede ejecutar el archivo denotado en la ruta delFile
.boolean canRead()
: Retornatrue
si la aplicación puede leer el archivo denotado en la ruta delFile
.boolean canWrite()
: Retornatrue
si la aplicación puede escribir en el archivo denotado en la ruta delFile
.int compareTo(File pathname)
: Compara la ruta delFile
con la del parámetro alfabéticamente. Si son iguales, retorna 0.boolean createNewFile()
: Crea un archivo vacío si el archivo con el nombre delFile
no existe.boolean delete()
: Elimina el archivo denotado en la ruta delFile
.boolean exists()
: Retornatrue
si el archivo denotado en la ruta delFile
existe.File getAbsoluteFile()
: Retorna la forma absoluta de la ruta del archivo.File getCanonicalFile()
: Retorna la forma canónica de la ruta del archivo.String getName()
: Retorna el nombre del archivo o directorio representado en elFile
.boolean isDirectory()
: Retornatrue
si la ruta que representa elFile
es un directorio.boolean isFile()
: Retornatrue
si la ruta que representa elFile
es un archivo.boolean isHidden()
: Retornatrue
si el archivo denotado en la ruta delFile
está oculto.long lastModified()
: Retorna el tiempo en que el archivo denotado en la ruta delFile
fue modificado.long length()
: Retorna el tamaño en bytes del archivo denotado en la ruta delFile
.boolean mkdir()
: Crea un directorio con el nombre y ruta denotados en elFile
.boolean setReadOnly()
: Establece el archivo denotado en la ruta delFile
como de solo lectura.boolean setWritable(boolean writable)
: Establece el archivo denotado en la ruta delFile
como escribible.
Escritura y Lectura de Archivos Binarios (Flujos de Bytes)
Conceptos de Archivos Binarios
Un archivo binario o de datos está formado por secuencias de bytes. Estos archivos pueden contener datos de tipo básico (int
, float
, char
, etc.) y objetos. Para poder leer el contenido de un archivo binario debemos conocer la estructura interna del fichero, es decir, debemos saber cómo se han escrito: si hay enteros, long
, etc., y en qué orden están escritos en el archivo. Si no se conoce su estructura, solo podemos leerlo byte a byte.
Escribir Datos en Ficheros Binarios
Para escribir datos en un fichero binario utilizaremos las clases Java FileOutputStream
y DataOutputStream
, derivadas de OutputStream
.
1. Clase FileOutputStream
La clase FileOutputStream
permite tener acceso al fichero para escribir bytes. Para crear objetos FileOutputStream
podemos utilizar los siguientes constructores:
FileOutputStream(String ruta)
FileOutputStream(File objetoFile)
FileOutputStream(String ruta, boolean append)
FileOutputStream(File objetoFile, boolean append)
Si el parámetro append
es true
, significa que los datos se van a añadir a los existentes. Si es false
, los datos existentes se pierden. Si se utiliza uno de los dos primeros constructores (sin append
), los datos existentes se pierden por defecto.
Los constructores lanzan una excepción FileNotFoundException
si el fichero no existe y no se ha podido crear. La clase FileOutputStream
proporciona el método write()
para escribir bytes en el fichero. Este método lanza una IOException
.
2. Clase DataOutputStream
A partir de un objeto FileOutputStream
se puede crear un objeto DataOutputStream
, que proporciona métodos para escribir datos de tipo primitivo en el archivo.
Para crear un objeto DataOutputStream
se utiliza el constructor:
DataOutputStream(OutputStream nombre);
La clase proporciona métodos writeXxx()
donde Xxx
es el nombre del tipo primitivo (ej. writeInt()
, writeFloat()
). Estos métodos lanzan una IOException
.
Lectura de Ficheros Binarios
Para leer de un fichero binario utilizaremos las clases Java FileInputStream
y DataInputStream
, derivadas de InputStream
.
1. Clase FileInputStream
La clase FileInputStream
permite leer bytes de un fichero. Para crear objetos FileInputStream
podemos utilizar los constructores:
FileInputStream(String ruta)
FileInputStream(File objetoFile)
Ambos lanzan una excepción FileNotFoundException
si el fichero no existe. La clase proporciona el método read()
para leer bytes del fichero. El método read
lanza una excepción IOException
.
2. Clase DataInputStream
A partir de un objeto FileInputStream
podemos crear un objeto DataInputStream
para leer datos de tipo primitivo.
Para crear un objeto DataInputStream
se utiliza el constructor:
DataInputStream(InputStream nombre);
La clase proporciona métodos readXxx()
donde Xxx
es el nombre del tipo primitivo (ej. readInt()
, readFloat()
). Estos métodos lanzan una excepción IOException
.
Cuando un método readXxx()
alcanza el final del fichero, lanza una excepción EOFException
(End Of File Exception).