viernes, 12 de octubre de 2018


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

LA ENTRADA/SALIDA EN JAVA Conceptos básicos de la entrada y salida en Java. Existe una gran variedad de clases para realizar operaci...