IO en Java
IO en Java
Índice
El paquete [Link]
Entrada y salida en Java
Introd.a la POO
El lenguaje Java • Este paquete proporciona al sistema las entradas y
¾ El paquete [Link].
Estruct. Biblioteca salidas a través de flujos de datos, las serializaciones y
Excepciones
¾ Flujos de datos (streams). el acceso al sistema de ficheros.
Colecciones ¾ Flujos de octetos (bytes).
9Entrada y salida
¾ Flujos de caracteres.
GUIs
¾ La clase File. • Está constituido por una serie de interfaces y clases
¾ Serialización de objetos. destinadas a definir y controlar los distintos tipos de
flujos, el sistema de ficheros y la serializaciones de
objetos.
La clase File. Métodos de instancia (I) La clase File. Métodos de instancia (II)
• Nombre de ficheros • Métodos para crear ficheros y directorios
String getName() boolean createNewFile()
String getParent() boolean mkdir()
String getAbsolutePath() boolean mkdirs()
String getPath()
• Métodos para listar directorios
boolean renameTo(File nuevoNombre) String[] list()
• Predicados sobre ficheros String[] list(FilenameFilter)
boolean exists() File[] listFiles()
File[] listFiles(FilenameFilter)
boolean canWrite()
File[] listFiles(FileFilter)
boolean canRead() ....
boolean isFile()
boolean isDirectory() interface FilenameFilter {
boolean isAbsolute() boolean accept(File dirActual, String ent);
}
• Información general interface FileFilter {
long lastModified() boolean accept(File path);
long length() }
• Borrar un fichero
boolean delete()
Departamento de Lenguajes y Departamento de Lenguajes y
Ciencias de la Computación Laboratorio de Tecnología de Objetos 7 Ciencias de la Computación Laboratorio de Tecnología de Objetos 8
Streams de bytes:
InputStream y OutputStream La familia InputStream
• Clases abstractas que definen el comportamiento mínimo de estos flujos.
IOException si hay error.
• Métodos de instancia de InputStream:
int read() // lee un byte y lo devuelve como int
int read(byte[] buf) // lee varios bytes y los guarda en buf
int read(byte[] buf, int offset, int count);
// devuelven -1 si no se lee nada porque se alcanza el final del stream
long skip(long n) // descarta n bytes de la entrada
• Métodos de instancia de OutputStream:
void write(int buf)
void write(byte[] buf)
void write(byte[] buf, int offset, int count)
void flush(); // descarga el buffer hacia la salida
Iniciales No iniciales
• Métodos de instancias comunes:
void close()
Departamento de Lenguajes y Departamento de Lenguajes y
Ciencias de la Computación Laboratorio de Tecnología de Objetos 11 Ciencias de la Computación Laboratorio de Tecnología de Objetos 12
• FileInputStream
FileInputStream(String name)
FileInputStream(File name)
• FileOutputStream
FileOutputStream(String name)
FileOutputStream(String name, boolean append)
FileOutputStream(File name)
Iniciales No iniciales • Los constructores producen FileNotFoundException
import [Link].*;
public class Copia {
public static void main(String args[]) { Ej: Copia Representación abstracta
FileInputStream desdeF = null;
FileOutputStream hastaF = null;
try {
del programa Copia
desdeF = new FileInputStream(args[0]);
hastaF = new FileOutputStream(args[1]);
// Copia de los bytes
int i = [Link]();
while (i != -1) { // -1 si se alcanza el fin de fichero
[Link](i);
i = [Link]();
} bytes bytes bytes bytes
[Link]();
[Link]();
} Fichero
catch (ArrayIndexOutOfBoundsException e) { Fichero FileInputStream Programa FileOutputStream
[Link]("Uso: Copia <origen> <destino>"); binario binario
}
catch (FileNotFoundException e) {
[Link]("No existe “ + e);
}
catch (IOException e) {
[Link]("Error de E/S “ + e);
}
}
}
Departamento de Lenguajes y Departamento de Lenguajes y
Ciencias de la Computación Laboratorio de Tecnología de Objetos 15 Ciencias de la Computación Laboratorio de Tecnología de Objetos 16
Filtros: DataInputStream y
Filtros
DataOutputStream
FilterInputStream y FilterOutputStream
¾ Envuelven y actúan sobre otros streams proporcionando
alguna funcionalidad adicional. • Constructores
¾ Únicamente reescriben los métodos de las respectivas clases DataInputStream(InputStream ent)
abstractas pasando las operaciones al stream sobre el que DataOutputStream(OutputStream sal)
actúan.
• Métodos de instancia
• DataInputStream y DataOutputStream
¾ Para cada tipo básico existe (también para String)
¾ Permiten que las aplicaciones puedan leer y escribir datos de
tipos simples de Java desde/sobre el flujo que envuelven. xxxxx readXxxxx()
¾ Deben usarse en correspondencia. void writeXxxxx(xxxxx)
• BufferedInputStream y BufferedOutputStream
¾ Proporcionan eficiencia en lectura y escritura.
import [Link].*;
public class Datos {
public static void main(String args[]) throws IOException {
Representación abstracta FileOutputStream gdF = new FileOutputStream("[Link]");
DataOutputStream dosF = new DataOutputStream(gdF);
// Escribimos algunos datos
[Link](true);
[Link]('A');
[Link](Byte.MAX_VALUE);
Escribir datos Leer datos readBoolean() [Link](Integer.MAX_VALUE);
writeBoolean(..) bytes bytes readByte() [Link](Double.MAX_VALUE);
writeByte(..) readLong() [Link](); // Cerramos el flujo. Cierra todos
DataOutputStream DataInputStream // Creamos un flujo de entrada de datos
writeLong(..) readFloat() FileInputStream ldF = new FileInputStream("[Link]");
writeFloat(..) FileOutputStream FileInputStream readInt() DataInputStream disF = new DataInputStream(ldF);
Fichero
writeInt(..) readDouble() // Leemos los datos guardados
binario boolean v = [Link]();
writeDouble(..) readShort() char c = [Link]();
writeShort(..) readChar() byte b = [Link]();
writeChar(..) readLine() int i = [Link]();
writeChars(..) double d = [Link]();
// Cerramos el flujo
[Link](); // cierra todo
// Mostramos los datos
FileOutputStream fos = new FileOutputStream("[Link]"); [Link](v);
[Link](c);
DataOutputStream dos = new DataOutputStream(fos); [Link](b);
[Link](i);
FileInputStream ldF = new FileInputStream("[Link]"); }
[Link](d); Ej: DataInputStream y
DataInputStream disF = new DataInputStream(ldF); } DataOutputStream
Departamento de Lenguajes y Departamento de Lenguajes y
Ciencias de la Computación Laboratorio de Tecnología de Objetos 19 Ciencias de la Computación Laboratorio de Tecnología de Objetos 20
Iniciales No iniciales
Iniciales No iniciales
• Java utiliza el juego de caracteres UNICODE • 8859_1 ISO Latin-1 (contiene ASCII)
• Cada plataforma tiene una codificación por • 8859_2 ISO Latin-2
defecto pero puede alterarse • 8859_3 ISO Latin-3
• Las clases Reader y Writer necesitan de un • 8859_4 ISO Latin/Cyrillic
codificador y decodificador • UTF8 Standard UTF-8 (cont. ASCII)
¾ InputStreamReader
(lee bytes y los decodifica como caracteres)
¾ OutputStreamWriter
(recibe caracteres y los codifica en bytes)
InputStreamReader y
Lectura de fichero. Opción 1ª
OutputStreamWriter
• 1) Crear un FileInputStream
Actúan de puente entre flujos de byte y flujos de caracteres con FileInputStream fisF = new FileInputStream("[Link]");
ayuda de un sistema de codificación. Utilizan un buffer de bytes
para agilizar la conversión • 2) Crear un InputStreamReader
InputStreamReader isrF = new InputStreamReader(fisF);
9 Aquí podría especificarse un codificador, p.e.:
• Constructores: InputStreamReader isrF =
new InputStreamReader(fisF,”8859_1”);
InputStreamReader(InputStream in)
InputStreamReader(InputStream in, String codigo)
Puede leerse con read() y read(cbuf,off,len)
OutputStreamWriter(OutputStream sal) caracteres
InputStreamReader
OutputStreamWriter(OutputStream sal, String codigo) FileInputStream
Fichero
• Métodos de instancia texto
String getEncoding() Codf.
Codf.
FileOutputStream FileOutputStream
Fichero Fichero
texto texto
BufferedReader y BufferedReader y
BufferedWriter BufferedWriter
• BufferedReader • BufferedWriter
Proporcionan eficiencia a la hora de leer o ¾ Métodos de instancia ¾ Métodos de instancia
escribir. Utilizan un buffer intermedio cuyo String readLine() String newLine()
void write(int c)
tamaño se puede especificar int read()
int read(Char[] c,int o,int l) ...
boolean ready() void flush()
Constructores boolean markSupported()
void close()
BufferedReader
BufferedReader
BufferedReader caracteres
caracteres BufferedReader
InputStreamReader caracteres InputStreamReader
FileReader
StringReader
FileInputStream FileInputStream
String
Fichero Fichero
texto texto
Codf. Codf. defecto
Codf.
• La clase PrintStream se comporta igual que
PrintWriter y ambas no provocan IOException
[Link](...)
[Link](...)
Serialización de objetos
Departamento de Lenguajes y
Ciencias de la Computación Laboratorio de Tecnología de Objetos 48
Departamento de Lenguajes y
Ciencias de la Computación Laboratorio de Tecnología de Objetos 51