• No se han encontrado resultados

Entrada y salida en un lenguaje orientado a objetos

N/A
N/A
Protected

Academic year: 2021

Share "Entrada y salida en un lenguaje orientado a objetos"

Copied!
23
0
0

Texto completo

(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 9Entrada 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 ¾ Fuentes y destinos: 9 Un array de bytes, 9 un fichero, 9 un pipe,

(2)

La clase File

• Proporciona herramientas básicas para la manipulación

de ficheros

de 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

p

flujos sobre ficheros.

La clase File. Independencia del SO

• Constantes definidas en la clase File

¾Separador de nombres en un path

char separatorChar ‘\’ ‘/’ ‘:’ String separator “\” “/” “:”

¾Separador de un path de otro

char pathSeparatorChar ‘:’ ‘;’ String pathSeparator “:” “;”

• Si queremos trabajar con \libro\capitulo

• Si queremos trabajar con \libro\capitulo

new File(File.separator + ”libro”

(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 ficheros

boolean exists() boolean isFile() boolean canWrite() boolean isDirectory() boolean canRead() VI-5 boolean canRead() boolean isAbsolute()

• Información general

long lastModified() long length()

• Borrar un fichero

boolean 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); }

interface FileFilter { boolean accept(File path); }

(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 de

dir(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)

ƒ InputStream

ƒ OutputStream

¾Flujos de texto (de caracteres, character streams)

ƒ Reader

(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 deMétodos de instancia de InputStreamInputStream::

int read()

// devuelve -1 si se alcanza el final del stream int 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

(6)

La familia OutputStream

VI-11

Iniciales

No iniciales

Streams sobre ficheros

• FileInputStream

FileInputStream(String name) FileInputStream(File name)

• FileOutputStream

FileOutputStream(String name)

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

L

d

il

d

i

(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 bytes int 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 abstracta

del programa Copia

bytes FileInputStream Fichero binario Fichero binario FileOutputStream bytes bytes bytes Programa

(8)

Filtros

• FilterInputStream

y

FilterOutputStream

¾ P

i

f

i

lid d di i

l

¾ Proporcionan funcionalidad adicional.

• DataInputStream

y

DataOutputStream

¾ Manipulan datos Java sobre el flujo.

• BufferedInputStream

y BufferedOutputStream

VI-15

• BufferedInputStream

y BufferedOutputStream

¾ Proporcionan eficiencia en lectura y escritura.

Filtros. DataInputStream y

DataOutputStream

• DataInputStream

DataInputStream(InputStream ent)

DataInputStream(InputStream ent)

• DataOutputStream

DataOutputStream(OutputStream sal)

• Métodos de instancia de DataInputStream

¾ Para cada tipo básico existe (también para String)

xxxxx readXxxxx()

()

9 Métodos de instancia de DataOutputStream

¾ Para cada tipo básico existe (también para String)

(9)

Representación abstracta

bytes bytes readBoolean() 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 datos

dosF.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 flujo

dosF.close();

// Creamos un flujo de entrada de datos

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

// Leemos los datos guardados boolean v = disF.readBoolean(); char c = disF.readChar(); byte b = disF.readByte(); int i = disF.readInt(); d bl d di F dD bl ()

Ejemplo de

DataInputStream

y

double d = disF.readDouble(); // Cerramos el flujo disF.close();

// Mostramos los datos System.out.println(v); System.out.println(c);

(10)

Filtros. BufferedInputStream y

BufferedOutputStream

• Proporcionan eficiencia a la hora de leer o escribir

¾ Utilizan un buffer intermedio

• BufferedInputStream

BufferedInputStream(InputStream ent)

• BufferedOutputStream

BufferedOutputStream(OutputStream sal)

DataOutputStream DataInputStream bytes 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 datos

dosF.writeBoolean(true); ...

// Cerramos el flujo dosF.close();

// Creamos un flujo de entrada de datos

FileInputStream ldF = new FileInputStream("datos.dat"); BufferedInputStream bisF = new BufferedInputStream(ldF); DataInputStream disF = new DataInputStream(bisF);

// Leemos los datos guardados boolean v = disF.readBoolean(); ...

(11)

Otros InputStream y OutputStream

• Otros flujos de entrada:

¾ByteArrayInputStream

¾PipedInputStream

¾SequenceInputStream

• 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 Reader

int 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

Writer void write(int b)

void write(char[] b) 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()

(12)

La familia Reader

VI-23

Iniciales

No iniciales

La familia Writer

(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

...

(14)

InputStreamReader

y

OutputStreamWriter

• InputStreamReader

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

InputStreamReader(InputStream in, String código)

• OutputStreamWriter

OutputStreamWriter(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 FileInputStream

FileInputStream fisF = new FileInputStream("datos.tex");

• 2) Crear un InputStreamReader

InputStreamReader isrF = new InputStreamReader(fisF);

9 Aquí podría especificarse un codificador

InputStreamReader isrF =

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

¾ Sólo puede leerse con read()

caracteres InputStreamReader Codf. Fichero texto caracteres FileInputStream

(15)

Lectura de fichero.

Opción 2ª

• 1) Crear un FileReader

Fil R d f F Fil R d ("d t t ") InputStreamReader Fil I S FileReader

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

9 Automáticamente se crea un FileInputStreamseguido de un InputStreamReadercon codificación por defecto

¾ Sólo puede leerse con read()

caracteres VI-29 FileInputStream Codf. defecto Fichero texto

Otros Reader

• Sustituyen a FileReader

¾ StringReader

g

¾ PipedReader

¾ CharArrayReader

String st = "Esto es un String";

StringReader sw = new StringReader(st);

int c = sw.read();

while (c != -1) {

System out println((char)c);

System.out.println((char)c);

c = sw.read();

}

StringReader

caracteres

(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

9Para imprimir todos los tipos básicos y objetos

print(...) println(...)

Escritura sobre un fichero.

Opción 1ª

1) Crear un FileOutputStream

FileOutputStream fosF = p new FileOutputStream("datos.tex");

2) Crear un OutputStreamWriter

OutputStreamWriter oswF = new OutputStreamWriter(fosF);

9 Aquí podría especificarse un codificador

3) Crear un PrintWriter

PrintWriter pwF = PrintWriter caracteres OutputStreamWriter PrintWriter pwF = new PrintWriter(oswF);

y ahora ...

pwF.println(”Hola a todos"); OutputStreamWriter Fichero texto FileOutputStream Codf.

(17)

Escritura sobre un fichero.

Opción 2ª

• 1) Crear un FileOutputStream

FileOutputStream fosF = PrintWriter PrintWriter p new FileOutputStream("datos.tex");

• 2) Crear un PrintWriter

PrintWriter pwF = new PrintWriter(fosF);

¾ Automáticamente se añade un OutputStreamWriter

con 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

FileWriter

FileWriter fwF new FileWriter("datos tex")

PrintWriter

OutputStreamWriter PrintWriter

FileWriter

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

¾ Un FileWriter es equivalente a un FileOutputStream

seguido de un OutputStreamWriter con decodificación

por defecto

2) Crear un

PrintWriter

PrintWriter pwF = i i (f ) caracteres OutputStreamWriter FileOutputStream Codf. defecto FileWriter new PrintWriter(fwF);

y ahora ...

pwF.println(”Hola a todos"); Fichero texto

(18)

Otros Writer

• Sustituyen a FileWriter

¾ StringWriter

g

¾ PipedWriter

¾ CharArrayWriter

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 escribir

¾Utilizan un buffer intermedio

• BufferedReader

BufferedReader(Reader ent)

BufferedReader(Reader ent, int size)

• BufferedWriter

BufferedWriter(Writer sal)

(19)

BufferedReader

y

BufferedWriter

• BufferedReader

¾ Mét d

d i t

i

¾ Métodos de instancia

String readLine() boolean ready() boolean markSupported() void mark(int readAheadLimit) void reset() long skip(long n) void close()

B ff

dW it

VI-37

• BufferedWriter

¾ Métodos de instancia

String newLine() void flush() void close()

BufferedReader

y ficheros

Opción 1ª Opción 2ª caracteres FileReader BufferedReader caracteres InputStreamReader Fichero texto FileInputStream Codf. BufferedReader InputStreamReader Fichero texto BufferedReader InputStreamReader FileInputStream Codf. defecto

(20)

Lectura con buffer de String

String BufferedReader StringReader caracteres VI-39

BufferedWriter

y ficheros (I)

Opción 1ª Opción 2ª PrintWriter caracteres OutputStreamWriter Fichero texto FileOutputStream Codf. BufferedWriter BufferedWriter caracteres Fichero texto PrintWriter FileWriter

(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 in

PrintStream out err PrintStream out, err

• Para leer con buffer

InputStreamReader isr =

new InputStreamReader(System.in);

BufferedReader stdIn = new BufferedReader(isr); String s = stdIn.readLine();

• La clase PrintStream se comporta igual que

PrintWriter

y ambas no provocan IOException

System.out.print(...)

(22)

Serialización de objetos

• Podemos incluir objetos dentro de un flujo y

después extraerlos del mismo

después extraerlos del mismo

¾ La clase debe implementar la interface

Serializable

, que no tiene métodos

¾ Cualquier variable definida como transient no será

guardada

¾ Se guardarán todos los objetos necesarios para

reconstruir el objeto a guardar

VI-43

reconstruir el objeto a guardar

¾ Las clases de la librería de Java son todas serializables

ObjectInputStream

y

ObjectOutputStream

• ObjectOutputStream

ObjectOutputStream(OutputStream sal)j p ( p )

¾ Métodos de instancia

void writeObject(Object obj) throws IOException;

• ObjectInputStream

ObjectInputStream(InputStream in)

¾ Métodos de instancia

Object readObject() throws IOException,

ClassNotFoundException; Fichero binario bytes bytes ObjectOutputStream FileOutputStream ObjectInputStream FileInputStream

(23)

Ejemplo. Guardar una lista

import 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 = List<Number> lista = (List<Number>) ois.readObject(); ois.close(); System.out.println(lista); }

Referencias

Documento similar

Awareness of the dynamic nature of interaction between the text and the reader is crucial for proper interpretation and translation of these texts since it reminds the translator

This particular case study of the English translation of Beauvoir’s Le deuxième sexe is indeed occurring more than 55 years after the fact; but the controversy that still seems to

En todos ellos, y gracias al cuidado en la presentación y sobre todo la calidad, Futureco es reconocida como una empresa de vanguardia en la oferta de productos para nutrición

Han de seleccionarse los medios que nos permitan impactar a los públicos objetivos, seleccionados con antelación mediante la información; conseguir que la comprenda y la interprete

[r]

&#34;Geología I&#34;; &#34;Geología II&#34;; &#34;Recursos geológicos de la tierra&#34;; Riesgos geológicos&#34;, con la metodología de la enseñanza a distancia. Líneas de

&#34;Procesado de señal&#34;, &#34;Técnicas de control I; &#34;Técnicas de control II&#34;, &#34;Automatización Industrial I&#34; (Grado en Ingeniería electrónica Industrial

&#34;Procesado de señal&#34;, &#34;Técnicas de control I; &#34;Técnicas de control II&#34;, &#34;Automatización Industrial I&#34; (Grado en Ingeniería electrónica Industrial