Publicado el 12 de Junio del 2018
466 visualizaciones desde el 12 de Junio del 2018
270,1 KB
76 paginas
Creado hace 13a (08/02/2011)
Tema 8
Entrada y Salida
todos
lado, prácticamente
ARCHIVOS Y FLUJOS
Los datos almacenados en variables (ya sean simples o en arreglos) sólo se conservan
mientras las variables están dentro de su ámbito. Esos datos se pierden cuando las
variables lo abandonan o el programa termina su ejecución. Si deseamos que los datos
se conserven debemos almacenar esos datos en un dispositivo de memoria secundaria:
discos y cintas magnéticas, discos compactos, discos magneto-ópticos, etc. Los datos
almacenados en forma permanente en un dispositivo de memoria secundaria se conocen
como datos persistentes. Por otro
los programas
computacionales requieren comunicarse con una serie de dispositivos de entrada/salida,
tales como el teclado, el monitor, los puertos serie y paralelo, etc.
Aunque cada dispositivo de memoria secundaria y cada dispositivo de entrada/salida es
físicamente diferente de los otros, el sistema operativo nos oculta las diferencias entre
ellos unificándolos bajo el concepto de archivo. Un archivo es un dispositivo lógico en
el que podemos escribir información o del que podemos leer información. No todos los
archivos tienen las mismas capacidades. Por ejemplo hay archivos a los que sólo
podemos escribir: monitor y puerto paralelo. Hay otros de los que sólo podemos leer, por
ejemplo el teclado. En algunos, como los archivos disco, podemos acceder la información
en forma aleatoria, mientras que en otros sólo en forma secuencial, por ejemplo el teclado
y los puertos serie y paralelo. Antes de poder leer o escribir en un archivo debemos de
abrirlo y al terminar de trabajar con un archivo debemos cerrarlo. Al abrir un archivo,
establecemos la comunicación entre el programa y el dispositivo y al cerrar el archivo
destruimos esa comunicación.
Adicionalmente al concepto de archivo, muchos lenguajes de programación, incluyendo a
Java, nos presentan una abstracción o interfaz común para los archivos: El flujo
(stream). Podemos considerar a un flujo como una corriente de bytes que se envía de
nuestro programa a un archivo o que nuestro programa recibe de un archivo. Esta interfaz
o intermediario nos oculta todas las diferencias que existen entre los archivos y nos
permiten concentrarnos en qué datos queremos enviar o recibir de un archivo y no en
cómo lo vamos a hacer. Al abrir un archivo se le asocia un flujo. Aunque un flujo es sólo
una secuencia de bytes, la información que contiene puede ser interpretada por nuestro
programa de dos formas: flujos texto y flujos binarios.
ITSON
Manuel Domitsu Kono
206
Entrada / Salida
Flujos Texto
Si el programa interpreta los bytes que lee o escribe a un archivo como caracteres, se
dice que el flujo es un flujo texto. Por ejemplo, algunos dispositivos de entrada y salida
como el teclado, el monitor y el puerto paralelo le envían a, o reciben de la computadora
bytes que representan caracteres. Por lo tanto, los flujos flujos asociados a esos
dispositivos son flujos texto. También si deseamos guardar en disco información en forma
de una secuencia de caracteres utilizaremos los flujos texto.
Un flujo texto es una secuencia de caracteres organizada en líneas, donde cada línea
termina en un carácter de salto de línea, el carácter cuyo código ASCII es 0xA
Flujos Binarios
Si los bytes escritos o leídos de un archivo no son interpretados como caracteres, se dice
que el flujo asociado al archivo es un flujo binario. En este caso los bytes pueden
representar cualquier cosa: valores numéricos, objetos, imágenes, etc.
Clases de Entrada y Salida de Java
java.io
La API de Java nos proporciona un gran número de interfaces y clases que nos permite
trabajar con archivos. Esas interfaces y clases se encuentran en el paquete:
En este tema sólo se verá una parte de las interfaces y clases del paquete java.io y
para su estudio, se dividirán en tres grupos de acuerdo a como el programa interpreta
el contenido de un archivo y a la forma de acceder a los datos almacenados en el
archivo.
Archivos de Caracteres de Acceso Secuencial
En este caso, accederemos a los datos del archivo en forma secuencial, es decir del
primero al último en ese orden. Para poder acceder a un dato intermedio deberemos
haber leído los anteriores en orden. Además en este caso los datos del archivo serán
interpretados por el programa como caracteres. En la figura 8.1 se muestra un
diagrama parcial de las interfaces y clases que podemos utilizar en este tipo de
problemas.
• La interfaz Readable se encuentra en el paquete java.lang y representa una
fuente de caracteres. Esta interfaz sólo declara un método que se muestra en la
tabla 8.1.
ITSON
Manuel Domitsu Kono
Tema 8
Entrada / Salida
207
Tabla 8.1 Método Declarado en la Interfaz Readable.
Figura 8.1 Interfaces y Clases para Archivos de Caracteres de Acceso Secuencial
int read(CharBuffer cb) throws IOException
Parámetro:
Regresa:
Intenta leer caracteres y los almacena en un buffer especificado
cb. El bufeer en que se escribirán los caracteres.
El número de caracteres agregados al buffer, -1 si la fuente de caracteres llegó a su final.
IOException – Si ocurre un error de entrada/salida
NullPointerException – Si cb es nulo.
ReadOnlyBufferException - Si cb es de solo lectura.
• La interfaz Closable representa una fuente o un destino que puede cerrarse.
Esta interfaz sólo declara un método que se muestra en la tabla 8.2.
Lanza:
ITSON
Manuel Domitsu Kono
208
Entrada / Salida
Tabla 8.2 Método Declarado en la Interfaz Closable.
void close() throws IOException
Lanza:
Cierra este flujo y libera los recursos del sistema asignados a él.
IOException – Si ocurre un error de entrada/salida
• La interfaz Flushable representa un destino que puede vaciarse. Escribe el
contenido del buffer al flujo. Esta interfaz sólo declara un método que se muestra
en la tabla 8.3.
Tabla 8.3 Método Declarado en la Interfaz Flushable.
void flush() throws IOException
Lanza:
Vacía el buffer escribiendo su contenido en el flujo.
IOException – Si ocurre un error de entrada/salida
• La interfaz Appendable se encuentra en el paquete java.lang y representa
un objeto al que se le pueden agregar caracteres. Esta interfaz declara varios
métodos que se muestran en la tabla 8.4.
Tabla 8.4 Métodos Declarados en la Interfaz Appendable.
Manuel Domitsu Kono
Lanza:
ITSON
Appendable append(char c) throws IOException
Parámetro:
Regresa:
c. El carácter a ser agregado al objeto.
Agrega un carácter al objeto.
Una referencia al objeto agregable.
IOException – Si ocurre un error de entrada/salida
Lanza:
Appendable append(charSecuence csq) throws IOException
Parámetro:
Regresa:
csq. Secuencia de caracteres a ser agregados al objeto.
Agrega una secuencia de caracteres al objeto.
Una referencia al objeto agregable.
IOException – Si ocurre un error de entrada/salida
Tema 8
Entrada / Salida
209
Tabla 8.4 Métodos Declarados en la Interfaz Appendable. Cont.
Agrega una subsecuencia de caracteres al objeto.
Appendable append(charSecuence csq, int start, int end) throws IOException
Parámetros:
csq. Secuencia de la que se obtendrá la secuencia de caracteres a ser agregados al objeto.
start. Índice del primer carácter de la subsecuencia.
end. Índice del último carácter de la subsecuencia.
Regresa:
Lanza:
Una referencia al objeto agregable.
IndexOutOfBoundsException - Si start o end son negativos, start > end, o end es
mayor que csq.length()
IOException – Si ocurre un error de entrada/salida
• La clase abstracta Reader es para leer de flujos de caracteres. Los métodos de
esta clase se muestran en la tabla 8.5.
Tabla 8.5 Métodos de la clase Reader.
Reader()
void mark(int readAheadLimit) throws IOException
Crea un flujo de caracteres de entrada.
Marca la posición actual en el archivo. Las siguientes llamadas al método reset()
posicionaran al archivo en este punto. No todos los flujos de entrada de caracteres soportan
esta operación.
readAheadLimit. Límite de caracteres que pueden leerse mientras se preserva la marca.
Después de leerse este número de caracteres, intentar reestablecer el flujo puede fallar.
IOException – Si el flujo no sopota el método mark() u ocurre un error de entrada/salida
Parámetros:
Lanza:
boolean markSupported()
Regresa:
Establece si el flujo soporta la operación mark().
true si y sólo si el flujo soporta la operación mark().
ITSON
Manuel Domitsu Kono
210
Entrada / Salida
Tabla 8.5 Métodos de la clase Reader. Cont.
int read() throws IOException
Lee un solo caracter. El método se bloquea hasta que haya un carácter, ocurra un error de
entrada/salida o se llegue al final del flujo
Regresa:
El carácter leído como un entero en el rango de 0 a 65,535 o -1 si se ha alcanzado el final del
flujo.
IOException – Si ocurre un error de entrada/salida
Lanza:
int read(char[] cbuf) throws IOException
Parámetro:
Lee caracteres en un arreglo.
cbuf: Arreglo en el que se almacenarán los caracteres.
Regresa:
El número de caracteres leídos o -1 si se ha alcanzado el final del flujo..
IOException – Si ocurre un error de entrada/salida
Lanza:
abstract int read(char[] cbuf, int off, int len) throws IOException
Parámetro:
Lee caracteres en una porción de un arreglo.
cbuf: Arreglo en el que se almacenarán los caracteres.
off: Índice en el arreglo del lugar en la que se empezarán a guardar los caracteres.
len: Máximo número de caracteres a leer.
Regresa:
El número de caracteres leídos o -1 si se ha alcanzado el final del flujo..
Lanza:
IOExcep
Comentarios de: Tema 8 - Entrada y Salida (0)
No hay comentarios