entrada y salida en un lenguaje orientado a...

23
1 Entrada y salida en un lenguaje orientado a objetos Introd. a la POO Índice El paquete IO. El lenguaje Java Estruct. Biblioteca Excepciones Colecciones Entrada y salida GUIs Flujos de datos (streams). La clase File. Flujos de octetos (bytes). Flujos de caracteres. Serialización de objetos. VI-1 Entrada/Salida Basada en Streams (flujos). Hay streams de lectura y de escritura. Fuentes y destinos: Fuente de datos Programa flujo lee Destino de datos flujo escribe VI-2 Fuentes y destinos: Un array de bytes, un fichero, un pipe, una conexión de red, ...

Upload: voxuyen

Post on 29-Apr-2018

225 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

1

Entrada y salida en un lenguaje orientado a objetos

Introd. a la POO

Índice

El paquete IO.El lenguaje JavaEstruct. BibliotecaExcepcionesColeccionesEntrada y salidaGUIs

Flujos de datos (streams).La clase File.Flujos de octetos (bytes).Flujos de caracteres.Serialización de objetos.

VI-1

Entrada/Salida• Basada en Streams (flujos).

Hay streams de lectura y de escritura.

Fuentes y destinos:

Fuente de datos Programa

flujo

lee Destinode datosflujo

escribe

VI-2

Fuentes y destinos: Un array de bytes, un fichero, un pipe, una conexión de red,...

Page 2: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

2

La clase File

• Proporciona herramientas básicas para la manipulación de ficherosde ficheros.

• Constructores:File(File ruta, String fichero)File(String ruta, String fichero)File(String rutaFichero)

• Los objetos de esta clase se usarán para la creación de

VI-3

j pflujos sobre ficheros.

La clase File. Independencia del SO• Constantes definidas en la clase File

Separador de nombres en un pathchar separatorChar ‘\’ ‘/’ ‘:’String separator “\” “/” “:”

Separador de un path de otrochar pathSeparatorChar ‘:’ ‘;’String pathSeparator “:” “;”

• Si queremos trabajar con \libro\capitulo

VI-4

• Si queremos trabajar con \libro\capitulo

new File(File.separator + ”libro” + File.separator + ”capitulo”);

Page 3: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

3

La clase File. Métodos de instancia (I)• Nombre de ficheros

String getName()String getAbsolutePath()String getPath()g g ()String getParent()boolean renameTo(File nuevoNombre)

• Predicados sobre ficherosboolean exists()boolean isFile()boolean canWrite()boolean isDirectory()boolean canRead()

VI-5

boolean canRead()boolean isAbsolute()

• Información generallong lastModified()long length()

• Borrar un ficheroboolean delete()

La clase File. Métodos de instancia (II)• Métodos para manipular directorios

boolean mkdir()String[] list()String[] list() String[] list(FilenameFilter)File[] listFiles()File[] listFiles(FilenameFilter)File[] listFiles(FileFilter)....

interface FilenameFilter {boolean accept(File dirActual, String ent);

VI-6

}interface FileFilter {

boolean accept(File path);}

Page 4: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

4

import java.io.*;

public class DirRec {public static void main(String args[]) {if (args.length == 0) System.err.println("Uso DirRec <directorio>");

else new DirRec(new File(args[0]));

}

public DirRec(File entrada) {di ( t d 0)

Ej: Listado recursivo dedir(entrada, 0);

}

private void dir(File entrada, int n) {if (!entrada.exists()) {

muestra(n, entrada.getName() + " no encontrado.");} else if (entrada.isFile()) {

muestra(n, entrada.getName());} else if (entrada.isDirectory()) {

File[] files = entrada.listFiles();muestra(n, "DIRECTORIO: " + entrada);f ( il f fil )

recursivo de un directorio

VI-7

for (File f : files)dir(f, n + 1);

}}

private void muestra(int n, String s) {for (int i = 0; i < n ; i++) System.out.print(" ");

System.out.println(s);}

}

Streams (Flujos)

• Dos tipos de flujos:Fl j bi i (d b b )Flujos binarios (de bytes, byte streams)

InputStreamOutputStream

Flujos de texto (de caracteres, character streams)Reader

VI-8

Writer

Page 5: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

5

Streams de bytes:InputStream y OutputStream

• Clases abstractas que definen el comportamiento mínimo de estos flujos.• IOException si hay error.• Métodos de instancia de InputStream:Métodos de instancia de InputStream:

int read()// devuelve -1 si se alcanza el final del streamint read(byte[] buf) int read(byte[] buf, int offset, int count)// devuelven -1 si no se lee nada porque se alcanza// el final del stream

• Métodos de instancia de OutputStream:

VI-9

void write(int buf)void write(byte[] buf) void write(byte[] buf, int offset, int count)void flush()

• Métodos de instancias comunes:void close()

La familia InputStream

VI-10

Iniciales No iniciales

Page 6: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

6

La familia OutputStream

VI-11

Iniciales No iniciales

Streams sobre ficheros

• FileInputStreamFileInputStream(String name)FileInputStream(File name)

• FileOutputStreamFileOutputStream(String name)FileOutputStream(String name, boolean append)FileOutputStream(File name)

L d il d i

VI-12

• Los constructores producen FileNotFoundException

Page 7: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

7

import java.io.*;public class Copia {public static void main(String args[]) {FileInputStream desdeF = null;FileOutputStream hastaF = null;try {

desdeF = new FileInputStream(args[0]);hastaF = new FileOutputStream(args[1]);

Ej: Copia

p ( g [ ]);// Copia de los bytesint i = desdeF.read();while (i != -1) { // -1 si se alcanza fin de fichero

hastaF.write(i);i = desdeF.read();

}desdeF.close();hastaF.close();

} catch (ArrayIndexOutOfBoundsException e) {

VI-13

} catc ( ay de OutO ou ds cept o e) {System.err.println("Uso: Copia <origen> <destino>");

} catch (FileNotFoundException e) {System.err.println("No existe “ + e);

} catch (IOException e) {System.err.println("Error de E/S “ + e);

} }

}

Representación abstractadel programa Copia

bytes

FileInputStreamFicherobinario

Ficherobinario

FileOutputStream

bytes bytesbytes

Programa

VI-14

Page 8: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

8

Filtros

• FilterInputStream y FilterOutputStreamP i f i lid d di i lProporcionan funcionalidad adicional.

• DataInputStream y DataOutputStreamManipulan datos Java sobre el flujo.

• BufferedInputStream y BufferedOutputStream

VI-15

• BufferedInputStream y BufferedOutputStreamProporcionan eficiencia en lectura y escritura.

Filtros. DataInputStream y DataOutputStream

• DataInputStreamDataInputStream(InputStream ent)DataInputStream(InputStream ent)

• DataOutputStreamDataOutputStream(OutputStream sal)

• Métodos de instancia de DataInputStreamPara cada tipo básico existe (también para String)xxxxx readXxxxx()

VI-16

()Métodos de instancia de DataOutputStream

Para cada tipo básico existe (también para String)void writeXxxxx(xxxxx)

Page 9: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

9

Representación abstracta

bytes bytesreadBoolean()readByte()

dL ()writeBoolean(..)

it B t ( )

Escribir datos Leer datos

Fichero binario

DataOutputStream readLong()readFloat()readInt()readDouble()readShort()readChar()readLine()

FileOutputStream

DataInputStream

FileInputStream

writeByte(..)writeLong(..)writeFloat(..)writeInt(..)writeDouble(..)writeShort(..)writeChar(..)writeChars(..)

VI-17

FileOutputStream fos = new FileOutputStream("datos.dat");

FileInputStream ldF = new FileInputStream("datos.dat");

DataOutputStream dos = new DataOutputStream(fos);

DataInputStream disF = new DataInputStream(ldF);

import java.io.*;public class Datos {

public static void main(String args[]) throws IOException {FileOutputStream gdF = new FileOutputStream("datos.dat");DataOutputStream dosF = new DataOutputStream(gdF); // Escribimos algunos datosdosF.writeBoolean(true);dosF.writeChar('A');dosF.writeByte(Byte.MAX_VALUE);dosF.writeInt(Integer.MAX_VALUE);dosF writeDouble(Double MAX VALUE);dosF.writeDouble(Double.MAX_VALUE);// Cerramos el flujodosF.close(); // Creamos un flujo de entrada de datosFileInputStream ldF = new FileInputStream("datos.dat");DataInputStream disF = new DataInputStream(ldF);// Leemos los datos guardadosboolean v = disF.readBoolean();char c = disF.readChar();byte b = disF.readByte();int i = disF.readInt();d bl d di F dD bl ()

VI-18

Ejemplo de DataInputStream y DataOutputStream

double d = disF.readDouble();// Cerramos el flujodisF.close();// Mostramos los datosSystem.out.println(v);System.out.println(c);System.out.println(b);System.out.println(i);System.out.println(d);

}}

Page 10: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

10

Filtros. BufferedInputStream y BufferedOutputStream

• Proporcionan eficiencia a la hora de leer o escribirUtilizan un buffer intermedio

• BufferedInputStreamBufferedInputStream(InputStream ent)

• BufferedOutputStreamBufferedOutputStream(OutputStream sal)

DataOutputStream DataInputStreambytes bytes

BufferedOutputStream BufferedInputStream

VI-19

Fichero binario

BufferedOutputStream

FileOutputStream

BufferedInputStream

FileInputStream

Ejemplo de BufferedInputStream y BufferedOutputStream

import java.io.*;

public class Datos {bli t ti id i (St i [] ) th IOE ti {public static void main(String[] args) throws IOException {FileOutputStream gdF = new FileOutputStream("datos.dat");BufferedOutputStream bosF = new BufferedOutputStream(gdF);DataOutputStream dosF = new DataOutputStream(bosF); // Escribimos algunos datosdosF.writeBoolean(true);...// Cerramos el flujodosF.close(); // Creamos un flujo de entrada de datos

VI-20

FileInputStream ldF = new FileInputStream("datos.dat");BufferedInputStream bisF = new BufferedInputStream(ldF);DataInputStream disF = new DataInputStream(bisF);// Leemos los datos guardadosboolean v = disF.readBoolean();...// Cerramos el flujodisF.close(); ...

Page 11: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

11

Otros InputStream y OutputStream

• Otros flujos de entrada:ByteArrayInputStreamPipedInputStreamSequenceInputStream

• Otros flujos de salida:ByteArrayOutputStream

VI-21

PipedOutputStream

Streams orientados a carácter.Reader y Writer

• Clases abstractas que definen el comportamiento mínimo de estos flujos. IOException si hay error

Métodos de instancia de Readerint read()int read(char[] b) long skip(long n) int read(char[] b, int off, int len); // devuelve -1 si no hay nada que leer

Métodos de instancia de Writervoid write(int b)void write(char[] b)

VI-22

void write(char[] b) void write(String s) void write(char[] b, int off, int len);void write(String s, int off, int len);void flush()

Método de instancia comúnvoid close()

Page 12: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

12

La familia Reader

VI-23

Iniciales No iniciales

La familia Writer

VI-24

Iniciales No iniciales

Page 13: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

13

Codificación de caracteres

• Java utiliza el juego de caracteres Unicode.• Cada plataforma tiene una codificación por

defecto pero puede alterarse.• Las clases Reader y Writer necesitan de un

codificador y decodificador:InputStreamReader

VI-25

OutputStreamReader

Normas de codificación

• ISO-8859-1 ISO Latin-1 (contiene ASCII)• ISO-8859-2 ISO Latin-2• ISO-8859-3 ISO Latin-3• ISO-8859-4 ISO Latin-4• ISO-8859-5 ISO Latin/Cyrillic•

VI-26

...• UTF-8 Standard UTF-8 (contiene ASCII)

Page 14: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

14

InputStreamReader y OutputStreamWriter

• InputStreamReaderI tSt R d (I tSt i )InputStreamReader(InputStream in)

InputStreamReader(InputStream in, String código)

• OutputStreamWriterOutputStreamWriter(OutputStream sal)

OutputStreamWriter(OutputStream sal, String código)

• Métodos de instancia

VI-27

String getEncoding()

Lectura de fichero.Opción 1ª

• 1) Crear un FileInputStreamFileInputStream fisF = new FileInputStream("datos.tex");

• 2) Crear un InputStreamReaderInputStreamReader isrF = new InputStreamReader(fisF);

Aquí podría especificarse un codificadorInputStreamReader isrF =

new InputStreamReader(fisF, ”ISO-8859-1”);

Sólo puede leerse con read()caracteres

VI-28

InputStreamReader

Codf.

Fichero texto

caracteres

FileInputStream

Page 15: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

15

Lectura de fichero.Opción 2ª

• 1) Crear un FileReaderFil R d f F Fil R d ("d t t ")

InputStreamReader

Fil I S

FileReader

FileReader frF = new FileReader("datos.tex");

Automáticamente se crea un FileInputStream seguido de un InputStreamReader con codificación por defecto

Sólo puede leerse con read()

caracteres

VI-29

FileInputStream

Codf. defecto

Fichero texto

Otros Reader

• Sustituyen a FileReaderStringReadergPipedReaderCharArrayReaderString st = "Esto es un String";StringReader sw = new StringReader(st);int c = sw.read();while (c != -1) {

System out println((char)c);

VI-30

System.out.println((char)c);c = sw.read();

}StringReadercaracteres

String

Page 16: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

16

La clase PrintWriter

• Permite representar textualmente los tipos básicos de Java y los objetos

PrintWriter(Writer sal)PrintWriter(Writer sal, boolean flush)PrintWriter(OutputStream sal)PrintWriter(OutputStream sal, boolean flush)

Métodos de instancia

VI-31

Para imprimir todos los tipos básicos y objetosprint(...) println(...)

Escritura sobre un fichero.Opción 1ª

1) Crear un FileOutputStreamFileOutputStream fosF = p

new FileOutputStream("datos.tex");

2) Crear un OutputStreamWriterOutputStreamWriter oswF =

new OutputStreamWriter(fosF);Aquí podría especificarse un codificador

3) Crear un PrintWriterPrintWriter pwF =

PrintWritercaracteres

OutputStreamWriter

VI-32

PrintWriter pwF = new PrintWriter(oswF);

y ahora ...pwF.println(”Hola a todos");

OutputStreamWriter

Fichero texto

FileOutputStream

Codf.

Page 17: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

17

Escritura sobre un fichero.Opción 2ª

• 1) Crear un FileOutputStreamFileOutputStream fosF =

PrintWriterPrintWriter

pnew FileOutputStream("datos.tex");

• 2) Crear un PrintWriterPrintWriter pwF = new PrintWriter(fosF);

Automáticamente se añade un OutputStreamWritercon decodificación por defecto

• y ahora ...pwF println(”Hola a todos"); caracteres

VI-33

OutputStreamWriter

FileOutputStream

Codf. defecto

FileOutputStream

pwF.println( Hola a todos ); caracteres

Fichero texto

Escritura sobre un fichero.Opción 3ª

1) Crear un FileWriterFileWriter fwF new FileWriter("datos tex")

PrintWriter

OutputStreamWriter

PrintWriter

FileWriter

FileWriter fwF = new FileWriter("datos.tex");

Un FileWriter es equivalente a un FileOutputStreamseguido de un OutputStreamWriter con decodificación por defecto

2) Crear un PrintWriterPrintWriter pwF =

i i (f )caracteres

VI-34

OutputStreamWriter

FileOutputStream

Codf. defecto

FileWriternew PrintWriter(fwF);

y ahora ...pwF.println(”Hola a todos");

Fichero texto

Page 18: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

18

Otros Writer

• Sustituyen a FileWriterStringWritergPipedWriterCharArrayWriter

StringWriter sw = new StringWriter();PrintWriter pw = new PrintWriter(sw);pw.println(”Hola a todos");System.out.println(sw.getBuffer());

VI-35

String

PrintWriter

StringWriter

caracteres

BufferedReader y BufferedWriter

• Proporcionan eficiencia a la hora de leer o escribirUtilizan un buffer intermedio

• BufferedReaderBufferedReader(Reader ent)BufferedReader(Reader ent, int size)

• BufferedWriter

VI-36

BufferedWriter(Writer sal)BufferedWriter(Writer sal, int size)

Page 19: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

19

BufferedReader y BufferedWriter

• BufferedReaderMét d d i t iMétodos de instanciaString readLine()boolean ready()boolean markSupported()void mark(int readAheadLimit)void reset()long skip(long n)void close()

B ff dW it

VI-37

• BufferedWriterMétodos de instanciaString newLine()void flush()void close()

BufferedReader y ficherosOpción 1ª Opción 2ª

caracteresFileReader

BufferedReader

caracteres InputStreamReader

Fichero texto

FileInputStream

Codf.

BufferedReader

InputStreamReader

Fichero texto

BufferedReader

VI-38

InputStreamReader

FileInputStream

Codf. defecto

Page 20: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

20

Lectura con buffer de String

String

BufferedReader

StringReader

caracteres

VI-39

BufferedWriter y ficheros (I)

Opción 1ª Opción 2ª

PrintWriter

caracteresOutputStreamWriter

Fichero texto

FileOutputStream

Codf.

BufferedWriter BufferedWritercaracteres

Fichero texto

PrintWriter

FileWriter

VI-40

Page 21: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

21

BufferedWriter y ficheros (II)

Opción 3ª

PrintWriter

caracteres

Fichero texto

FileOutputStream

BufferedWriter

VI-41

Terminal E/S• La clase System tiene tres variables de clase públicas

InputStream inPrintStream out errPrintStream out, err

• Para leer con bufferInputStreamReader isr =

new InputStreamReader(System.in);BufferedReader stdIn = new BufferedReader(isr);

String s = stdIn.readLine();

VI-42

• La clase PrintStream se comporta igual que PrintWriter y ambas no provocan IOExceptionSystem.out.print(...) System.out.println(...)

Page 22: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

22

Serialización de objetos

• Podemos incluir objetos dentro de un flujo y después extraerlos del mismodespués extraerlos del mismo

La clase debe implementar la interface Serializable, que no tiene métodosCualquier variable definida como transient no será guardadaSe guardarán todos los objetos necesarios para reconstruir el objeto a guardar

VI-43

reconstruir el objeto a guardarLas clases de la librería de Java son todas serializables

ObjectInputStream y ObjectOutputStream

• ObjectOutputStreamObjectOutputStream(OutputStream sal)j p ( p )

Métodos de instanciavoid writeObject(Object obj) throws IOException;

• ObjectInputStreamObjectInputStream(InputStream in)

Métodos de instanciaObject readObject() throws IOException,

ClassNotFoundException;

VI-44

Fichero binario

bytesbytesObjectOutputStream

FileOutputStream

ObjectInputStream

FileInputStream

Page 23: Entrada y salida en un lenguaje orientado a objetosdgp.lcc.uma.es/contenidos/transparencias/6-EntradaSalida.pdfEntrada y salida en un lenguaje ... ¾Serialización de objetos. VI-1

23

Ejemplo. Guardar una listaimport java.io.*;import java.util.*;

public class Serout {bli t ti id i (St i [] )public static void main(String[] args)throws IOException {List<Number> lista = new LinkedList<Number>();lista.add(3);lista.add(4.5);lista.add(56.2);System.out.println(lista);FileOutputStream fos =

new FileOutputStream("obj txt");

VI-45

new FileOutputStream( obj.txt );ObjectOutputStream oos =

new ObjectOutputStream(fos);oos.writeObject(lista);oos.close();

}}

Ejemplo. Cargar la lista guardada

import java.io.*;import java.util.*;

public class Serin {public static void main(String[] args)

throws Exception {FileInputStream fos =new FileInputStream("obj.txt");

ObjectInputStream ois =new ObjectInputStream(fos);

List<Number> lista =

VI-46

List<Number> lista = (List<Number>) ois.readObject();

ois.close();System.out.println(lista);

}}