Vous êtes sur la page 1sur 59

Un flujo de entrada / salida (I/O stream, Input / Output stream) representa una fuente desde la cual se reciben datos

o un destino hacia el cual se envan datos. Un flujo de datos puede provenir o dirigirse hacia archivos en disco, dispositivos de comunicaciones, otros programas o arreglos en memoria. Los datos pueden ser bytes, tipos primitivos, caracteres propios de un idioma local, u objetos.

Los flujos pueden simplemente transferir datos sin modificacin o manipular esos datos para transformarlos de diversas maneras como parte del proceso de transferencia.

Archivo
es un conjunto de datos de largo variable

identificado con un nombre. Un nombre de archivo suele tener dos partes separadas por un punto.

La primera parte alude a su propsito; la

segunda, llamada extensin, indica el tipo de datos que contiene.

Directorio
conjunto de archivos guardados bajo un

nombre comn, el nombre del directorio. Un directorio puede estar dentro de otro directorio, llamado a veces "directorio padre. Se forma as un rbol de directorios, una organizacin jerrquica de directorios y subdirectorios contenidos en ellos, en varios niveles

Path
Lista ordenada de directorios que lleva

desde la raz del rbol hasta un archivo especfico. Ejemplo:


F:\DA2_MATERIAL\archivos\archivos.pdf /home/DA2_MATERIAL/archivos/archivos.pdf

Sistema de archivos
La forma en que uno o ms rboles de directorios se organizan en forma fsica dentro de medios de almacenamiento o memoria

Acceso aleatorio ("random"):


Los archivos de acceso aleatorio, al igual

que lo que sucede usualmente con la memoria (RAM=Random Access Memory), permiten acceder a los datos en forma no secuencial, desordenada.

Esto implica que el archivo debe estar

disponible en su totalidad al momento de ser accedido, algo que no siempre es posible.

Acceso secuencial (flujos o "streams")


En

este caso los datos son ledos secuencialmente, desde el comienzo del archivo hasta el final (el cual muchas veces no se conoce a priori).

Este es el caso de la lectura del teclado o la

escritura en una consola de texto, no se sabe cundo el operador terminar de escribir.

Concatenacin (tuberas o "pipes"):


Muchas veces es til armar conexiones entre

programas que corren simultneamente dentro de una misma mquina, de forma que lo que uno produce se enva por un tubo para ser recibido por el otro, que est esperando a la salida del tubo.

Las tuberas o "pipes" cumplen esta funcin.

Sea cual sea el tipo de datos, un flujo se presenta como una secuencia de datos. Un flujo de entrada (input stream) lee datos de una fuente, un item por vez. Un flujo de salida (output stream) escribe datos en un destino, un item por vez.

Cualquier programa realizado en Java que necesite llevar a cabo una operacin de I/O lo har a travs de un stream. Un stream, cuya traduccin literal es "flujo", es una abstraccin de todo aquello que permite introducir o extraer informacin. As, un stream de teclado es un flujo de entrada para el programa y un stream de pantalla es un flujo de salida del programa

Input: Teclado

Output: Pantalla

La vinculacin de este stream al dispositivo fsico (teclado, pantalla, archivo, impresora, etc.) la hace el sistema de entrada y salida de Java

Los flujos de caracteres


suelen ser clases envolventes de los flujos de

bytes.

Los flujos de caracteres usan los flujos de

bytes a nivel fsico; los flujos de bytes realizan las transformaciones requeridas por los esquemas de codificacin en forma transparente (invisible) para el usuario.

Flujos de datos
soportan operaciones de entrada salida de

datos de tipo primitivo (boolean, char, byte, short, int, long, float, y double) as como cadenas de caracteres (String).

Las clases
FileInputStream FileOutputStream manipulan flujos de bytes provenientes o

dirigidos hacia archivos en disco.

Ejemplo:
Copiar

el contenido de un archivo de texto a otro archivo de texto.

El flujo de bytes slo es apto para las operaciones ms elementales de entrada salida En el ejemplo anterior, como se sabe que es un archivo con caracteres, lo mejor es usar los flujos de caracteres definidos en las clases:
FileReader y FileWriter

Estas clases descienden de Reader y Writer, y estn destinadas a la lectura y escritura de caracteres en archivos.

La plataforma Java codifica los caracteres en Unicode, manejando automticamente las conversiones a juegos de caracteres correspondientes a los idiomas locales. En el manejo de flujos de caracteres la variable int retiene un caracter en los ltimos 16 bits, correspondiente a Unicode; en el flujo por bytes la variable int retiene un valor de byte en sus ltimos 8 bits. Este manejo no es visible al usuario.

La clase

FileReader usa FileInputStream,

la clase

FileWriter usa FileOutputStrea m.

El programa resulta idntico salvo por los tipos de flujo utilizados

Lectura y Escritura de Archivos por linea


Solo aplica para archivos que son de texto Se utilizan las clases:
BufferedReader PrintWriter

Aqu se muestra un flujo de entrada con buffer.

Un buffer es un rea de memoria utilizada como almacenamiento intermedio para mejorar la eficiencia de las operaciones de entrada salida: escribir o leer de memoria es mucho ms rpido que escribir o leer de dispositivos perifricos. Cuando se usan buffers slo se lee o escribe en el dispositivo final cuando el buffer est lleno, reduciendo la cantidad de operaciones de lectura y escritura sobre los dispositivos lentos

Las clases para entrada salida con buffer son clases envolventes de las clases para entrada salida sin buffer. Las clases disponibles para entrada salida con buffer son:
para flujos de bytes BufferedInputStream y BufferedOutputStream para flujos de caracteres BufferedReader y BufferedWriter.

Estas clases disponen del mtodo flush() para forzar la operacin de entrada salida est o no el buffer lleno, operacin que conviene hacer en momentos crticos donde puede haber prdida de informacin.

Un programa puede correrse desde la lnea de comando en una terminal, e interactuar con el usuario para pedir ingreso de datos en la lnea de comando, digitando caracteres. En Java existen varios flujos para interaccin con el usuario en lnea de comando

Estos flujos se denominan flujos estndar (standard streams), y son comunes en varios sistemas operativos. Por defecto estos flujos leen del teclado y escriben en pantalla. Estos flujos pueden redirigirse hacia archivos u otros programas. En Java hay tres flujos estndar:

Estos objetos ya estan definidos automaticamente por lo que no requieren ser abiertos

la entrada estndar (Standard Input), accesible a travs del objeto System.in; la salida estndar (Standard Output), accesible a travs del objeto System.out; y el error estndar (Standard Error) accessible a travs del objeto System.err

La entrada estndar est asignada al teclado.

La salida estndar y el error estndar estn asignados a la pantalla.


El flujo de error estndar puede asignarse a un archivo u otro dispositivo, de modo que pueda correrse el programa sin que el usuario vea los mensajes de error, pero permitiendo capturarlos o verlos en otro dispositivo

Parece natural que los flujos estndar sean flujos de caracteres, pero por razones histricas son flujos de bytes.

System.out y System.err son objetos de tipo PrintStream. Aunque tcnicamente es un flujo de datos, PrintStream usa internamente un objeto flujo de caracteres para emular las caractersticas de los flujos de caracteres. En cambio System.in es un flujo de bytes sin caractersticas de flujo de caracteres.
Para usar la entrada estndar como flujo de caracteres se "envuelve" el objeto System.in en un objeto InputStreamReader.

El siguiente ejemplo le pide al usuario que ingrese una cadena de caracteres para posteriormente imprimirla

Los flujos de datos soportan operaciones de entrada salida de datos de tipo primitivo:
boolean, char, byte, short, int, long, float, y double as como cadenas de caracteres (String)

Los flujos de datos implementan la interfaz DataInput o la interfaz DataOutput. Las implementaciones ms usadas de estas interfaces son las clases DataInputStream y DataOutputStream.

Los flujos de objetos permiten realizar operaciones de entrada salida de objetos. Muchas de las clases estndar soportan serializacin de sus objetos, implementando la interfaz Serializable. La serializacin de objetos permite guardar el objeto en un archivo escribiendo sus datos en un flujo de bytes. Es posible luego leer desde el archivo el flujo de bytes y reconstruir el objeto original.

Las clases de flujos de objetos son:


ObjectInputStream y ObjectOutputStream.

Estas clases implementan las interfaces


ObjectInput y ObjectOutput, subinterfaces de: DataInput y DataOutput

El siguiente programa implementa la aplicacin anterior pero usando objetos BigDecimal para los precios, y un objeto Calendar para la fecha. Excepcion ClassNotFoundException
Es lanzada cuando el metodo readObject()

no puede devolver el tipo correcto.

Los metodos:
WriteObject ReadObject

Recorren todas las clases buscando todo lo

necesario para poder construir el flujo con todos los objetos necesarios.

Los

objetos guardados se reconstruyen exactamente como estaban; si existen varias referencias a un mismo objeto, cuando los objetos sean reconstruidos todas esas referencias seguirn apuntando al mismo objeto.

Existen operaciones de entrada salida sobre archivos que no pueden tratarse como flujos de datos.
La clase File permite examinar y manipular archivos y directorios, en forma independiente de la plataforma (MS Windows, Solaris, Linux). Los archivos pueden accederse tambin en forma:
no secuencial o aleatoria (random access files);

existen clases especficas para acceder a los archivos sin necesidad de recorrerlos ordenadamente.

Objetos de Tipo File


Las instancias de la clase File representan nombres de archivo, no los archivos en s. El archivo correspondiente a un nombre puede no existir. Un objeto de clase File permite examinar el nombre del archivo, descomponerlo en su rama de directorios, o crear el archivo si no existe pasando el objeto de tipo File a un constructor adecuado como FileWriter(File f), que recibe como parmetro un objeto File. Para archivos existentes, a travs del objeto File un programa puede examinar los atributos del archivo, cambiar su nombre, borrarlo o cambiar sus permisos. Estas operaciones pueden hacerse independientemente de la plataforma sobre la que est corriendo el programa.

Si el objeto File se refiere a un archivo existente un programa puede usar este objeto para realizar una serie de operaciones sobre el archivo:
el

mtodo delete() borra el archivo inmediatamente; deleteOnExit() lo borra cuando finaliza la ejecucin de la mquina virtual Java. setLastModified() permite fijar la fecha y hora de modificacin del archivo:
new File("factura.txt").setLastModified( new Date().getTime() );

el mtodo renameTo() permite renombrar el archivo,

aunque el objeto File dejar de referirse al archivo renombrado, ya que el String con el nombre del archivo en el objeto File no cambia.

el mtodo mkdir() crea un directorio, mkdirs() tambin,

pero crea los directorios superiores si no existen. los mtodos list() y listFiles() listan el contenido de un directorio. list() devuelve un arreglo de String con los nombres de los archivos, listFiles() devuelve un arreglo de objetos File. el mtodo esttico createTempFile() crea un nuevo archivo con un nombre nico de su creacin y devuelve un objeto File que apunta a l. Es til para crear archivos temporales, que luego se borran, asegurndose de tener un nombre de archivo no repetido. el mtodo esttico listRoots() devuelve una lista de nombres de archivo correspondientes a la raz de los sistemas de archivos. En Microsoft Windows sern de formato a:\ y c:\, en UNIX y Linux ser el directorio raz nico /.

Ejemplo que muestra los archivos existentes en el directorio en el que se ejecuta el programa.

Un archivo de acceso aleatorio permite leer o escribir datos en forma no secuencial. El contenido de un archivo suele consistir en un conjunto de partes o registros, generalmente de distinto tamao. Una bsqueda de informacin en el archivo equivale a ubicar un determinado registro. En el acceso secuencial es preciso leer el archivo pasando por todos sus registros hasta llegar al registro que se desea ubicar. En promedio debe leerse la mitad del archivo en cada bsqueda. Si el tamao de los registros es conocido puede crearse un ndice con punteros hacia cada registro.

La bsqueda de un registro comienza entonces por ubicar ese registro en el ndice, obtener un puntero hacia el lugar del archivo donde se encuentra el contenido de ese registro, y desplazarse hacia esta posicin directamente. El acceso aleatorio descrito es mucho ms eficiente que el acceso secuencial

La clase java.io.RandomAccessFile implementa las interfaces DataInput y DataOutput, lo cual permite leer y escribir en el archivo. Para usar RandomAccessFile se debe indicar un nombre de archivo para abrir o crear si no existe. Se debe indicar tambin si se abrir para lectura o tambin para escritura (para poder escribir es necesario tambin poder leer).

La siguiente sentencia abre un archivo de nombre archivouno.txt para lectura, y la siguiente abre el archivo archivodos.txt para lectura y escritura:
RandomAccessFile f1 = new RandomAccessFile("archivouno.txt", "r"); RandomAccessFile f2 = new RandomAccessFile("archivodos.txt", "rw");

Una vez abierto el archivo pueden usarse los mtodos:


read() o write()

definidos en las interfaces DataInput y DataOutput para realizar las operaciones de entrada salida sobre los archivos. La clase RandomAccessFile maneja un puntero al archivo (file pointer). Este puntero indica la posicin actual en el archivo.

Cuando el archivo se crea el puntero al archivo se coloca en 0, apuntando al principio del archivo. Las sucesivas llamadas a los mtodos read() y write() ajustan el puntero segn la cantidad de bytes ledos o escritos.

Adems los mtodos de entrada salida que ajustan el puntero automticamente, la clase RandomAccessFile tiene mtodos especficos para manipular el puntero al archivo:
int skipBytes(int) : mueve el puntero hacia

adelante la cantidad especificada de bytes. void seek(long) : ubica el puntero justo antes del byte especificado en el entero long. long getFilePointer() : devuelve la posicin actual del puntero, el nmero de byte indicado por el entero long devuelto.

El siguiente ejemplo muestra el uso de un archivo de acceso aleatorio y el valor de los punteros. Crea una tabla de races cubicas de los nmeros 0 a 9 expresada como decimales doble precisin tipo double, de largo 8 bytes. Realiza las siguientes tareas:
1. 2.

3. 4.

Calcula los cuadrados, los guarda en un archivo de acceso aleatorio y cierra el archivo. Abre el archivo recin creado, desplaza el puntero 40 bytes (5 double de 8 bytes cada uno), lee el registro ubicado a partir del byte 40 (raz cuadrada del nmero 5: 2,23...),verifica el avance del puntero a 48 (avanz un double en la lectura), cambia su valor por el nmero arbitrario 333.0003 y cierra el archivo. Abre nuevamente el archivo, ahora en slo lectura, y muestra punteros y valores. Intenta escribir en el archivo de slo lectura, levantando y capturando la excepcin.

Las clases PipedInputStream y PipedOutputStream son utilizadas en conjunto para transmitir datos de una punta a la otra de un tubo. Este mecanismo permite transferir datos entre programas.

Las clases InputStream, OutputStream y sus asociadas mueven datos a nivel de bytes. Un byte es la unidad de informacin tradicionalmente utilizada en computadoras. El tamao de un byte (8 bits de valor 0 o 1) es suficiente para representar pequeos nmeros (256 valores posibles) as como letras y smbolos del alfabeto ingls (cdigo ASCII) o bien de alfabetos similares como los derivados del latn (norma ISO88591).

La codificacin Unicode permite representar todos los alfabetos humanos existentes. Unicode es compatible con ASCII a travs de diversos mecanismos de adaptacin. UTF8 (Unicode Transformation Format 8) tiene caracteres de largo variable, de 1 o 2 bytes. Las clases Reader y Writer manejan tanto codificaciones ISO88591 como Unicode.

El examen de la API de Java muestra la complejidad y variedad de clases contenidas en el paquete java.io. La vista del arbol en la API de java.io muestra la jerarqua de clases. Algunas otras clases tiles permiten:
Manipular archivos comprimidos en el paquete java.util.zip: ZipFile, ZipInputStream, ZipOutputStream), para formato ZIP, y sus equivalentes GZIPFile, etc. para formato GZIP, agregar

checksums para detectar errores o alteraciones de archivos, CheckedInputStream, CheckedOutputStream.

Para manejar archivos tipo JAR (Java ARchive, tambin tipo ZIP) en java.util.jar.

Sun MicroSystems. The Java Tutorials. Basic

I/O,

http://java.sun.com/docs/books/tutorial/essen tial/io/index.html

Wikipedia, Unicode Transformation Format

UTF8

http://es.wikipedia.org/wiki/UTF8

Wikipedia, Unicode http://es.wikipedia.org/wiki/Unicode

Sun

Microsystems. Java Specification Second Edition,

Language

http://java.sun.com/docs/books/jls/second_e dition/html/jTOC.doc.html

Sun Microsystems. Java 2 Platform, Standard

Edition (J2SE). API Specifications.

http://java.sun.com/reference/api/index.html

Sun Microsystems. Java 2 Platform, Standard

Edition (J2SE),

http://java.sun.com/j2se/

Vous aimerez peut-être aussi