Documentos de Académico
Documentos de Profesional
Documentos de Cultura
02 Java IO
02 Java IO
Departamento de
Matemticas y
Computacin
Grado en Informtica
Agenda
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Grado en Informtica Programacin de Bases de datos
Agenda
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Grado en Informtica Programacin de Bases de datos
Justificacin
Vamos a utilizar Java como lenguaje de programacin de la
asignatura
Una de las caractersticas intrnsecas de los sistemas distribuidos:
computadores conectados que se intercambian mensajes
Las conexiones de red en Java son tratadas como streams (como si
fuesen ficheros)
A travs de esos streams se envan y reciben los mensajes (como
si grabsemos o leysemos ficheros)
Adems la informacin intercambiada entre los nodos estar, en
muchas ocasiones, almacenada en ficheros.
Es imprescindible un dominio de los APIs de entrada/salida de Java
Streams
La E/S de Java se realiza a travs de flujos (streams).
Secuencia ordenada de bytes
Agenda
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Grado en Informtica Programacin de Bases de datos
La clase OutputStream
Clase abstracta de la que derivan los dems flujos de salida.
Fundamentalmente ofrece los siguientes servicios:
public
public
public
public
public
FileOutputStream
ByteArrayOutputStream
PipedOutputStream
sun.net.TelnetOutputStream
FileOutputStream
El FileOutputStream redefine el
mtodo write para enviar el byte a un
fichero.
FileOutputStream f;
f = new FileOutputStream(Datos.dat);
for (int i = 0; i < 100; i++)
f.write(i);
f.close();
ByteArrayOutputStream
El ByteArrayOutputStream redefine el mtodo write para enviar
el byte a un array dinmico (en memoria).
Aade los mtodos:
public byte[] toByteArray()
public int size()
Ejemplo
ByteArrayOutputStream ba;
ba = new ByteArrayOutputStream();
for (int i = 0; i < 100; i++)
ba.write(i);
ba.close();
10
Agenda
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Grado en Informtica Programacin de Bases de datos
11
FilterOutputStream
Un filtro de salida es un OutputStream al cual se le
asocia en su constructor otro OutputStream (patrn
Decorator)
Los filtros reenvan toda la informacin que reciben a su
OutputStream asociado, previa realizacin de algn
tipo de transformacin en la misma.
De esta manera cada filtro aade una funcionalidad
adicional al OutputStream que encapsula.
Se pueden encadenar varios filtros para obtener varias
funcionalidades combinadas.
12
OutputStream
+f lush:v oid
+write:v oid
+close:v oid
FileOutputStream
ByteArrayOutputS tream
PipedOutputStream
GZIPOutputStream
TelnetOutputS tream
DataOutputStream
13
FilterOutputStream
PrintStream
BufferedOutputS tream
Composicin de filtros
OutputStream out =
GZIPOutputStream
BufferedOutputStream
CipherOutputStream
FileOutputStream
new GZIPOutputStream(
new CipherOutputStream(
new FileOutputStream(
f.txt))) ;
Grado en Informtica Programacin de Bases de datos
14
Filtro DataOutputStream
Los mtodos de la clase OutputStream solo permiten enviar
bytes.
Cualquier otro tipo debern descomponerse en una secuencia de
bytes antes de poder escribirse.
FileOutputStream
int i;
out.write((i >>>
out.write((i >>>
out.write((i >>>
out.write((i >>>
15
Filtro DataOutputStream
La clase DataOutputStream aade la funcionalidad de poder
enviar todos los tipos primitivos directamente.
void
void
void
void
void
void
void
void
void
16
Filtro DataOutputStream
DataOutputStream dos;
dos = new DataOutputStream(new FileOutputStream(A));
dos.writeInt(i);
dos.writeDouble(3.14);
dos.writeChars(Hola);
dos.close(); // Se cierra tambin el socio
17
Filtro PrintStream
La clase PrintStream aade la funcionalidad de poder enviar
todos los tipos primitivos en formato texto.
Ofrece los mtodos print y println sobrecargados para todos
los tipos primitivos.
System.out es de tipo PrintStream
PrintStream ps;
ps = new PrintStream(new FileOutputStream(A));
ps.println(1);
ps.println(3.14);
ps.println(Hola);
ps.close(); // Se cierra tambin el socio
18
Combinacin
La forma ms habitual de usar un OutputStream ser combinando varios
filtros.
DataOutputStream dos;
dos = new DataOutputStream(
new FileOutputStream(A)
);
// Se transforma: DataOutput
dos.writeInt(i);
dos.writeDouble(3.14);
dos.writeChars(Hola);
// Se vuelca: File
dos.close(); // Se cierran todos
19
Uso de OutputStreams
Qu se puede comentar sobre la siguiente clase?
class
Persona
{ {
class
Persona
private
String
nombre;
private
String
nombre;
private
intint
edad;
private
edad;
Persona
(String
nombre,
intint
edad)
{ {
Persona
(String
nombre,
edad)
this.nombre
= nombre;
this.nombre
= nombre;
this.edad
=
edad;
this.edad = edad;
} }
public
void
escribe(FileOutputStream
public
void
write(FileOutputStream f)
f) throws
throws IOExcepcion
IOExcepcion {
{
DataOutputStream
dos;
DataOutputStream
dos;
dos
=
new
DataOutputStream(f);
dos = new DataOutputStream(f);
dos.writeChars(nombre);
dos.writeUTF(nombre);
dos.writeInt(edad);
dos.writeInt(edad);
} }
} }
20
Uso de OutputStreams
public static void main(String args[]) {
Persona[] v = new Persona[100];
for (int i = 0; i < v.length; i++)
v[i] = new Persona(Pepe + i, i);
FileOutputStream f =
new FileOutputStream(Personas.dat);
for (int i = 0; i < v.length; i++)
v[i].escribe(f);
f.close();
}
Grado en Informtica Programacin de Bases de datos
21
Agenda
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Grado en Informtica Programacin de Bases de datos
22
Clase InputStream
Clase abstracta de la que derivan los dems flujos de entrada.
Fundamentalmente ofrece los siguientes servicios:
public
public
public
public
public
Hay varias clases que derivan de InputStream y redefinen el mtodo read para
darle una implementacin distinta:
FileInputStream.
ByteArrayInputStream.
StringInputStream.
SequenceInputStream.
PipedInputStream.
TelnetInputStream
23
FileInputStream
El FileInputStream redefine el mtodo
read para leer el byte de un fichero.
FileInputStream f;
f = new FileInputStream(Datos.dat);
int dato;
while ((dato = f.read()) != -1)
System.out.println(dato);
f.close();
24
25
ByteArrayInputStream
El ByteArrayInputStream redefine el mtodo read para leer el byte de
un array que se le pase en el constructor.
Ejemplo
byte[] v = new byte[1024];
ByteArrayInputStream
ba;
ByteArrayInputStream
ba;
ba =
ByteArrayInputStream(v);
banew
= new
ByteArrayInputStream(v);
intint
dato;
dato;
while ((dato = ba.read()) != -1)
while ((dato = ba.read()) != -1)
System.out.println(dato);
System.out.println(dato);
ba.close();
ba.close();
26
StringInputStream
El StringInputStream redefine el mtodo read para leer el
siguiente carcter de una cadena que se le pase en el constructor.
Sirve para tratar un String como si fuese un stream
Ejemplo
StringInputStream
StringInputStream
ba; ba;
= new
StringInputStream(Hola);
baba
= new
StringInputStream(Hola);
int
dato;
int
dato;
while
((dato
= ba.read())
!= -1)
while
((dato
= ba.read())
!= -1)
System.out.println(dato);
System.out.println(dato);
ba.close();
ba.close();
27
SequenceInputStream
Cuando se tienen varios InputStreams que se desean procesar seguidos se
pueden concatenar mediante un SequenceInputStream.
De esta manera aparecen como un nico InputStream continuo.
FileInputStream
f1, f2;
FileInputStream
f1, f2;
f1 =
FileInputStream(Datos1.dat);
f1new
= new
FileInputStream(Datos1.dat);
f2 =
FileInputStream(Datos2.dat);
f2new
= new
FileInputStream(Datos2.dat);
SequenceInputStream sis;
SequenceInputStream sis;
sis = new SequenceInputStream(f1, f2);
int dato;
int((dato
dato;= sis.read()) != -1)
while
while ((dato = sis.read()) != -1)
System.out.println(dato);
System.out.println(dato);
sis.close();
sis.close();
28
Agenda
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Grado en Informtica Programacin de Bases de datos
29
FilterInputStream
Un filtro de entrada es un InputStream al cual se le
asocia en su constructor otro InputStream.
Los filtros devuelven la informacin que a su vez han
ledo de su InputStream asociado, previa realizacin
de algn tipo de transformacin en la misma.
De esta manera cada filtro aade una funcionalidad
adicional al InputStream bsico.
Se pueden encadenar varios filtros para obtener varias
funcionalidades combinadas.
30
Filtro DataInputStream
Los mtodos de la clase InputStream solo permiten leer bytes.
Cualquier otro tipo debern leerse como una secuencia de bytes y
recomponerse antes de poder utilizarse.
FileInputStream
= new
FileInputStream(datos.dat);
FileInputStream
in =innew
FileInputStream(datos.dat);
= in.read();
int int
ch1 ch1
= in.read();
= in.read();
int int
ch2 ch2
= in.read();
= in.read();
int int
ch3 ch3
= in.read();
= in.read();
int int
ch4 ch4
= in.read();
if ((ch1
| ch2
| ch3
| ch4)
if ((ch1
| ch2
| ch3
| ch4)
< 0)< 0)
throw
EOFException();
throw
new new
EOFException();
= ((ch1
<< 24)
+ (ch2
<< 16)
+ (ch3
<< +8)(ch4
+ (ch4
<< 0));
int int
i = i((ch1
<< 24)
+ (ch2
<< 16)
+ (ch3
<< 8)
<< 0));
// Idem
String,
float,
// Idem
parapara
String,
float,
etc.etc.
31
Filtro DataInputStream
La clase DataInputStream aade la funcionalidad de
poder leer todos los tipos primitivos directamente.
readBoolean()
readChar
readByte()
readShort()
readInt()
readLong()
readFloat()
readDouble()
readLine()
readFully(byte[] b)
32
Filtro DataInputStream
DataInputStreamdis;
dis;
DataInputStream
dis= =new
newDataInputStream(new
DataInputStream(newFileInputStream(A));
FileInputStream(A));
dis
inti i= =dis.readInt();
dis.readInt();
int
doubled d= =dis.readDouble();
dis.readDouble();
double
Strings s= =dis.readLine();
dis.readLine();
String
dis.close();////SeSecierra
cierratambin
tambinelelsocio
socio
dis.close();
33
34
Combinacin
La forma ms habitual de usar un InputStream ser combinando
varios filtros.
DataInputStream dis;
dis = new DataInputStream(
new FileInputStream(A)
);
int i = dis.readInt();
double d = dis.readDouble();
String s = dis.readLine();
dis.close(); // Se cierra tambin el socio
35
Uso de InputStreams
Qu se puede comentar sobre la siguiente clase?
public class Persona {
private String nombre;
private int edad;
public Persona (String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
public void lee(FileInputStream f) throws IOException {
DataInputStream dis;
dis = new DataInputStream(f);
nombre = dis.readUTF();
edad = dis.readInt();
}
}
36
Agenda
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Grado en Informtica Programacin de Bases de datos
37
Readers y Writers
Los streams estn orientados a la E/S de bytes
Los Readers y los Writers estn orientados a la E/S de
caracteres.
Tenemos la mala costumbre de asumir que todo el texto es
ASCII (en este caso hay equivalencia entre byte y char)
Pero no en todas las partes del mundo pasa eso.
Su existencia se justifica por la necesidad de escribir caracteres
en distintos juegos de caracteres y as facilitar la
internacionalizacin
Existe una jerarqua paralela entre Readers e InputStreams (y
Writers y OutputStreams). Ej: FileInputStream
FileReader.
Para convertir un InputStream en un Reader existe
InputStreamReader (y para writers OutputStreamWriter)
La recomendacin es que siempre que se vaya a escribir texto
se escriba con Writer.
Grado en Informtica Programacin de Bases de datos
38
Encoding: correspondencia entre caracteres Unicode y bytes usados para representar ese
carcter xej. en un fichero.
Al leer los bytes, para transformarlos en caracteres, hay que usar el mismo encoding.
Si no se puede leer basura
39
O con BufferedReader
BufferedReader br = new BufferedReader (...);
String linea;
while ( (linea = br.readLine()) != null) {
// Hacer algo con linea
}
Grado en Informtica Programacin de Bases de datos
40
Agenda
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Grado en Informtica Programacin de Bases de datos
41
Clase File
Los objetos de la clase File representan ficheros en un sistema de
ficheros
Slo los representan
No se escribe ni lee en los fichero a travs de un File
42
Serializacin de objetos
Departamento de
Matemticas y
Computacin
Grado en Informtica
Introduccin
La serializacin es el proceso de transformar
un objeto en una secuencia de bytes y su
reconstruccin posterior a partir de la misma
La secuencia de bytes obtenida mediante la
serializacin podr ser almacenada en un
fichero, transmitida por la red, etc...
Posteriormente se podr recuperar una copia
del objeto en el mismo estado en el que
estaba cuando se serializ
Grado en Informtica Programacin de Bases de datos
44
Introduccin
Para poder leer y escribir objetos simplemente hay que
utilizar dos nuevos tipos de streams: el
ObjectOutputStream y el ObjectInputStream.
La nica condicin que debe cumplir una clase para ser
serializable es implementar el interface Serializable
Es un marker, no tiene ningn mtodo y simplemente sirve
para marcar la clase como serializable
Si no serializable java.io.NotSerializableException
45
Introduccin - Ejemplo
class A implements Serializable{
public int i;
}
. . .
// Escritura de una instancia de una clase serializable
A a = new A();
FileOutputStream f = new FileOutputStream(prueba.ser);
ObjectOutputStream oos = new ObjectOutputStream(f);
oos.writeObject(a);
oos.close();
. . .
// Lectura de una instancia de una clase serializable
FileInputStream f = new FileInputStream(prueba.ser);
ObjectInputStream ois = new ObjectInputStream(f);
A a = (A) ois.readObject();
Ver formato
ois.close();
Grado en Informtica Programacin de Bases de datos
46
Introduccin
En la serializacin se almacena el contenido de todos los atributos
de la instancia, incluidos los privados y los heredados. Por tanto
debern ser de tipos primitivos o de tipos Serializables.
Si tiene algn atributo no serializable, la clase no puede serializarse (a
no ser que se marque como transient)
No se almacenan
Campos transient
Campos static
47
Introduccin
Serializar un array implica serializar todos
sus elementos.
Los atributos estticos no se serializan
En el proceso de reconstruccin del objeto
no se llama al constructor de las clases
serializables
Sus atributos se inicializan a partir de la
informacin del stream.
Grado en Informtica Programacin de Bases de datos
48
Atributos transient
Hay veces que no interesa guardar todos los atributos de una
instancia:
Informacin confidencial: ej. un string que guarde una password.
Informacin redundante: atributos derivados de otros que se tienen ya
calculados por eficiencia, pero que no es necesario guardarlos.
Atributos que no se pueden serializar, ya que son de un tipo no
serializable.
49
Escritura de instancias
Hay ocasiones en que interesa controlar el proceso de escritura:
Se desean guardar ciertos atributos en otro formato ms compacto que
el que mantienen en memoria
Si se desea escribir informacin adicional junto con los atributos de la
instancia
50
Lectura de instancias
As mismo hay ocasiones en que interesa controlar el proceso de lectura:
Inicializar atributos que se guardaron en otro formato (por ejemplo volver a
obtener la imagen a partir del nombre del fichero).
Leer la informacin adicional que se escribi en writeObject.
Dar un valor adecuado a los atributos transient.
52
os.close()
Departamento de
Matemticas y
Computacin
Grado en Informtica