LA ENTRADA/SALIDA EN JAVA
Conceptos
básicos de la entrada y salida en Java.
Existe
una gran variedad de clases para realizar operaciones de entrada y salida de
datos:
STREAMS
Los
streams son flujos secuenciales de bytes.
Para
que un programa pueda leer datos de alguna fuente, debe crear un stream de
entrada conectado a ésta; una fuente típica puede ser el teclado o un fichero.
Y para escribir datos hacia un destino, debe crear un stream de salida conectado a éste; un destino
típico puede ser la pantalla o un fichero.
Java
proporciona distintas clases para el manejo de estos flujos de información,
todas ellas contenidas en el paquete java.io.
JERARQUÍA DE CLASES EN EL PAQUETE JAVA.IO
- El paquete java.io
en el JDK 1.02
- El paquete java.io
en el JDK 1.1
CLASES IMPORTANTES PARA LA ENTRADA/SALIDA ESTÁNDAR
Composición
de las clases más importantes para la Entrada/Salida estándar en Java son:
InputStream,
OutputStream y PrintStream; aunque hay que señalar que no son únicamente
importantes para la E/S estándar sino en general. Sobre todo las dos primeras,
que son las clases de la que parten todas las demás que tratan con streams de
entrada y salida de bytes.
- La clase
InputStream
Esta
clase es abstracta (abstract). Es la
superclase de todas las clases que implementan un stream de entrada de bytes.
Las
aplicaciones que necesiten definir una subclase de InputStream
siempre deben proporcionar un método que devuelva el siguiente byte de entrada
(deben redefinir el método abstracto: public
abstract int read () ).
Todos
los métodos, a excepción del constructor y los métodos mark
() y markSupported () son
susceptibles de generar excepciones de la clase java.io.IOException.
- La clase OutputStream
Esta clase es una clase abstracta que es superclase
de todas las clases que implementan un stream de bytes de salida.
Las aplicaciones que necesiten definir una subclase
de OutputStream
siempre deben proporcionar al menos un método que escriba un byte de salida
( public
abstract void write(int b) ).
Todos los métodos, a excepción del constructor
pueden generar una excepción de la clase java.io.IOException.
- La clase PrintStream
Esta clase se encarga de escribir valores y objetos
en un stream de salida en forma de
caracteres. Para ello realiza una conversión de caracteres a la codificación en
bytes dependiente de la plataforma en caso necesario. También proporciona buffering.
Esta clase no genera excepciones. Para ver si se ha
producido algún error hay que llamar al método checkError ().
Es mejor utilizar la clase PrintWriter en lugar de
esta, que se mantiene únicamente por cuestiones de compatibilidad con el JDK
1.02.
ENTRADA/SALIDA ESTÁNDAR
En
la clase System existen tres
atributos estáticos (atributos de clase):
- out
(objeto de la clase
PrintStream): Es un streamde salida que dirige el flujo de
bytes hacia la salida estándar (la pantalla).
- in
(objeto de la clase InputStream): Es un stream de
entrada que acepta un flujo de bytes de la entrada estándar (el teclado).
- err
(objeto de la clase PrintStream): Es un stream de
salida que dirige el flujo de bytes hacia la salida de error (la
pantalla).
Estos
tres atributos son estáticos y, por lo tanto, no necesita instanciarse ningún
objeto de la clase System para poder utilizarlos. Además, son streams
que ya seencuentran abiertos y listos para ser utilizados.
STREAMS DE CARACTERES
Al
igual que la totalidad de las clases que tratan con streamsde bytes tiene como
raíz las clases InputStream y OutputStream
para entrada y salida respectivamente. En el caso de los streams de caracteres
se dispone de las clases Reader y Writer.
Aparte
de éstas, las clases más importantes para la entrada por teclado y salida por
pantalla son PrintWriter y BufferedReader.
- La clase Reader
La clase Reader es análoga a la clase
InputStream, pero mientras
esta última trata con streams de entrada de bytes, la
clase Reader trata con streams de caracteres.
- La clase Writer
La clase Writer
es análoga a la clase OutputStream,
pero mientras ésta última trata con streams de salida de bytes, la
clase Writer trata con streams de caracteres.
- La clase
BufferdReader
Un BufferedRreader se construye a partir
de un objeto de la clase Reader, pudiéndose indicar el tamaño
del buffer de caracteres de entrada.
Únicamente añade un método con respecto a la
clase Reader. Este método es readLine()
y sirve para lee una línea de texto completa (hasta que se encuentra el
carácter ‘\n’, ‘\r’ o ambos consecutivamente).
- La clase PrintWriter
Para
construir un objeto de esta clase es necesario realizarlo a partir de un objeto
subyacente de la clase OutputStream o Writer.
En el constructor puede indicarse, además, un parámetro de tipo boolean. Si su valor es true, indica que se vacíe el buffer
(flush) al llamar a alguno de los métodos
println(). Si su valor es false, no se vaciará el buffer hasta que se haga
explícitamente mediante el método flush().
ENTRADA POR TECLADO Y SALIDA POR PANTALLA
Para la salida por pantalla debería utilizarse la
clase PrintWriter y para la entrada por teclado, BufferdReader (aunque a veces, por razones de comodidad y prisa, se
utilicen directamente System.out. y System in).
FICHEROS
La mayoría de las aplicaciones
de una cierta entidad hacen uso de ficheros para almacenar valores.
Antes de empezar a ver cómo
utilizar las clases que crean los streams
de entrada o salida sobre ficheros es necesario conocer algunas clases que
permiten acceder a información referente a los mismos y que no intervienen en
los flujos de datos hacia o desde ellos.
Para ello existen las clases File y FileDescriptor:
- ·
La clase File
La clase File sirve para representar ficheros o
directorios en el sistema de ficheros de la plataforma específica. Mediante
esta clase pueden abstraerse las particularidades de cada sistema de ficheros y
proporcionar los métodos necesarios para obtener información sobre los mismos.
-
La clase FileDescriptor
Esta clase no debería utilizarse para instanciar objetos
de la misma, sino que se suele utilizar algún método que devuelve un objeto de
la clase FileDescriptor.
- · Acceso
a ficheros secuenciales
Para acceder a datos almacenados en ficheros sin
demasiadas pretensiones de formateo, y con acceso secuencial, puede utilizarse
la clase FileInputStream que implementa los métodos de la clase InputStream
sin mayores funcionalidades.
Para almacenar datos en un fichero, puede crearse un stream de salida mediante la clase más
simple que implementa los métodos de la clase
OutputStream: FileOutputStream.
- · La
clase RandomAccessFile
Esta clase sirve para crear un
objeto de acceso a un fichero de acceso directo a partir de un objeto de la
clase File o, directamente, a partir de un String
que contenga el nombre del fichero. Los constructores aceptan un segundo
parámetro que indica el modo de apertura.
- Acceso
a ficheros aleatorios
Los ficheros de acceso
aleatorio o directo permiten situar el puntero del fichero en una posición
determinada sin tener que recorrer previamente el contenido del fichero como
ocurre con los ficheros de acceso secuencial vistos anteriormente.
Para trabajar con ficheros
aleatorios, únicamente es necesaria la clase RandomAccessFile, que proporciona directamente (no heredados) todos
los métodos para leer y escribir datos del fichero (los indicados en las
interfaces DataInput y DatoOutput).
SERIALIZACIÓN DE OBJETOS
La serialización
consiste en la transformación de un objeto Java en una secuencia de bytes para
ser enviados a un stream.
Mediante este mecanismo pueden
almacenarse objetos en ficheros o incluso en bases de datos como BLOBs (Binary
Large OBject), o se pueden enviar a través de sockets, en aplicaciones cliente/servidor de un equipo a otro, por
ejemplo. Pero todo esto no es nuevo, ya podía hacerse antes de la serialización
de objetos, lo que ocurre es que con este instrumento se consigue de una forma
mucho más cómoda
y sencilla.
- · Esquema
de funcionamiento de la serialización
Para
enviar y recibir objetos serializados a través de un stream
se utilizan las clases java.io.ObjectOutputStream para la
salida y java.io.ObjectInputStream para
la entrada.
La
clase ObjectOutputStream necesita como parámetro en su constructor un objeto
de la clase OutputStream (alguna de sus subclases, ya que OutputStream es abstracta).
- ·
Personalización en la serialización
Una
clase puede controlar por sí misma cómo será serializada, alterando qué datos serán
almacenados o leídos, definiendo los métodos
writeObject() y readObject().











No hay comentarios:
Publicar un comentario