Download archivos en JAVA

Document related concepts
no text concepts found
Transcript
Paquete java.io
372
(a) conceptos generales
(b) uso de streams
(c) serialización de objetos
(d) archivos de acceso aleatorio
(e) acceso a bases de datos (paquete java.sql)
Programación Orientada a Objetos – DCIC UNS – 2002
Conceptos
• generalmente, un programa necesita traer y mandar información desde o a fuentes
externas: un archivo, en memoria, otro programa, o una base de datos.
• esa información puede estar en diversos formatos: caracteres de texto, objetos, imagenes, sonido, bytes o registros de tablas relacionales.
373
• el paquete java.io provee el manejo básico para esta funcionalidad. Extensiones
adicionales están presentes en otros paquetes.
Programación Orientada a Objetos – DCIC UNS – 2002
Conceptos
• para el manejo de entrada y salida de datos, el paquete java.io utiliza una abstracción de todos los posibles dispositivos, denominada Stream.
• un stream es una secuencia de información que el programa lee o envı́a hacia un
dispositivo.
374
• no importando el tipo de la información, o el tipo del dispositivo la lectura y escritura
de streams se hace con el mismo protocolo.
Programación Orientada a Objetos – DCIC UNS – 2002
Conceptos
Algoritmo de Lectura de Streams
1: abrir el stream
2: while exista información do
3:
leer información
end while
cerrar el stream
4:
5:
375
Algoritmo de Escritura de Streams
1: abrir el stream
2: while exista información do
3:
escribir información
end while
cerrar el stream
4:
5:
Programación Orientada a Objetos – DCIC UNS – 2002
Conceptos
• el paquete java.io posee dos jerarquı́as independientes de clases de acuerdo al tipo
de datos que el stream maneja:
– Character Streams
– Byte Streams
• Reader y Writer son clases abstractas ancestros de todos los streams de caracteres
de lectura y escritura, respectivamente. Proveen la funcionalidad básica común a
todos.
• los streams de caracteres implementan las operaciones de lectura/escritura de caracteres de 16 bits en código Unicode. Código nativo se encarga de traducir esta
representación a la codificación del sistema en caso de ser necesario.
376
Uso de Streams
int read()
int read(byte cbuf[])
int read(byte cbuf[],
int offset, int length)
void write()
void write(byte cbuf[])
void write(byte cbuf[],
int offset, int length)
• las operaciones de las cuatro clases abstractas Reader, Writer, InputStream y
OutputStream siguen interfaces análogas:
int read()
int read(char cbuf[])
int read(char cbuf[],
int offset, int length)
void write()
void write(char cbuf[])
void write(char cbuf[],
int offset, int length)
378
• las clases FileReader, FileWriter, FileInputStream y FileOutputStream
son clases concretas que implementan cada uno de los comportamientos respectivos
sobre archivos. En los respectivos constructores se debe indicar el objeto de tipo File
sobre el cual actuan.
Programación Orientada a Objetos – DCIC UNS – 2002
Uso de Streams
Programación Orientada a Objetos – DCIC UNS – 2002
Conceptos
• las clases PipeReader, PipeWriter, PipeInputStream y PipeOutputStream
son clases concretas que implementan la comunicación entre programas.
Programación Orientada a Objetos – DCIC UNS – 2002
379
• la clase SequenceInputStream crea un único stream a partir de la concatenación
de varios ya existentes. En el constructor se pasa como parámetro una lista con los
streams correspondientes.
• en general, estos y otros streams se pueden implementar de forman que encapsulen a
otros streams. Por ejemplo, un PipeReader puede encapsular a aun FileReader.
• los streams de bytes implementan las operaciones de lectura/escritura de bytes de
8-bits. Son las clases InputStream y OutputStream que se usan para leer y escribir
datos binarios tales como archivos comprimidos, imágenes y sonidos.
• Dos de los descendientes de estas clases ObjectInputStream y ObjectOutputStream
son usadas para almacenar objetos.
377
• hay que tener en cuenta en el caso de applets aspectos de seguridad para el acceso a
los dispositivos fı́sicos.
Programación Orientada a Objetos – DCIC UNS – 2002
• el paquete java.io provee un conjunto de abstractas que implementan parcialmente la posibilidad de filtrar datos mientras se leen o escriben. Estas clases son
FileReader, FileWriter, FileInputStream y FileOutputStream.
Uso de Streams
• el método writeObject serializa el objeto especificado, recorre todas sus referencias
y también las serializa, manteniendo las relaciones entre objetos.
• las operaciones sobre estos streams se hacen mediante versiones de writeObject
y readObject. El resultado de esta última de convertirse mediante casting al tipo
correspondiente.
Serialización de Objetos
Programación Orientada a Objetos – DCIC UNS – 2002
382
• es posible implementar una serialización a medida
• todos los objetos que serán serializados deben ser instancias de clases que implementen
la interface Serializable. Esta es una interface vacı́a, que sólo está para indicar
que sus instancias son posibles de ser persistentes.
• un stream filtro se construye encapsulando otro stream. El método read lee la entrada
de este stream, filtra los datos, y recién devuelve los resultados. El método write
primero filtra los datos, y luego los escribe en el stream encapsulado.
• el filtrado puede ser diverso: puede involucrar un proceso de buffering para no acceder tan seguido a las operaciones de bajo nivel (clases BufferedInputStream y
BufferedOutputStream); puede contar los datos o convertirlos en otro formato.
380
Archivos de Acceso Aleatorio
Programación Orientada a Objetos – DCIC UNS – 2002
Serialización de Objetos
• todos los streams mencionados hasta el momento son de acceso secuencial: los datos
deben ser leı́dos exactamente en el orden en que fueron escritos.
Programación Orientada a Objetos – DCIC UNS – 2002
383
• la clase RandomAccessFile implementa en java.io un archivo de acceso aleatorio,
que puede ser usada tanto para lectura como para escritura de bytes.
• aunque éstos son extremadamente útiles para la mayorı́a de las aplicaciones, a veces
son necesarios archivos de acceso aleatorio que permiten acceder a sus contenido en
forma no secuencial, o aleatoria.
• dos clases de java.io: ObjectInputStream y ObjectOutputStream funcionan
para operar streams sobre objetos. Este proceso se denomina serialización de objetos
dado que los estados y las identidades de objetos se transforman en secuencias de
bytes.
• se puede usar serialización de objetos para:
– Remote Method Invocation (RMI) donde un programa Java se comunica con otro
programa Java a través del envı́o de mensajes. La serialización en este caso se
implementa para el pasaje de parámetros y del resultado.
381
– para implementar persistencia liviana: almacenaje de objetos para una futura recuperación en otra ejecución del mismo programa. Es liviana ya que el formato no
depende de código nativo.
Programación Orientada a Objetos – DCIC UNS – 2002
Archivos de Acceso Aleatorio
• todo objeto instancia de RandomAccessFile soporta el concepto de puntero que
indica la posición actual dentro del archivo. Es un entero que empieza en 0 y se mide
en bytes.
384
• RandomAccessFile provee comandos y una consulta para operar sobre el puntero.
Programación Orientada a Objetos – DCIC UNS – 2002
Acceso a Bases de Datos
• los Sistemas de Manejo de Bases de Datos (DBMS) son programas que permiten
realizar todas las actividades relativas a la creación, mantenimiento y consulta de
grandes cantidades de datos.
• los DBMS relacionales pueden conectarse a programas en Java a través de consultas
en el lenguajes SQL. Las clases necesarias están disponibles en el paquete java.sql.
• el programa Java envı́a (en forma de texto) una operación SQL al DBMS (local o
remoto), y recibe como respuesta una lista con los registros que satisfacen los criterios
especificados.
385
• el programa Java debe manejar objetos de tipo conexión, transacción, sentencia, y
conjunto de resultados (ResultSet).
Programación Orientada a Objetos – DCIC UNS – 2002