Professional Documents
Culture Documents
Antonio J. Sierra
Índice
1. Introducción. Flujos.
2. Estructura y clases del paquete java.io
Introducción
• El paquete java.io define la Entrada/Salida
en términos de stream (o flujos).
• Un flujo es una secuencia ordenada de datos que
contienen fuente/destino.
• Los flujos son abstracciones que producen o
consumen información.
– Relacionado con un dispositivo físico.
– Mismas clases y métodos de E/S a cualquier
dispositivo físico.
• Abstrae de los detalles del Sistema Operativo.
Clasificación de los flujos
• Hay dos tipos de flujos: de caracteres y de bytes.
• Los flujos de caracteres
– Unicode (16 bits).
– Texto (caracteres legibles como código fuente …).
• Los flujos de bytes
– byte (8 bits).
– Datos binarios (imagen, …).
– No transportan adecuadamente los caracteres.
• Casi todo flujo de entrada tiene su correspondiente de
salida.
• La mayoría de flujos de caracteres tiene su equivalente
de byte.
Clases del paquete java.io
• Consta de clases generales con una
clasificación de bytes y caracteres.
• Lectura/Escritura de valores primitivos y
cadenas de texto.
• Clases e interfaces para interactuar con
archivos.
• Serialización de objetos.
• Excepciones: IOException.
Clasificación de los flujos
• Filter: Operaciones de filtrado y construcción filtros encadenados.
• Buffered: No necesitan acceder al sistema de archivos en cada
invocación.
• Piped: Diseñados por parejas.
• ByteArray: usan una matriz de bytes.
• CharArray: usan una matriz de chars.
• String:usan una cadena de caracteres.
• Print: impresión en formato legible.
• LineNumberReader: cuenta líneas.
• SequenceInputStream: da un flujo de varios.
• Pushback: envía datos de retorno.
• StreamTokenizer: divide un flujo en tokens.
Flujos de bytes
• Clases Abstractas
– InputStream
• Métodos para leer bytes.
• Es superclase de la mayoría de bytes de entrada.
– OutputStream
• Análoga a InputStream.
• Proporciona métodos para escribir en un destino.
DataOutput DataInput
ObjectOutput ObjectInput
OutputStream InputStream
ObjectOutputStream ObjectInputStream
ByteArrayOutputStream SequenceInputStream
ByteArrayInputStream
PipedOutputStream
PipedInputStream
FileOutputStream
FileInputStream
FilterOutputStream FilterInputStream
DataOutputStream DataInputStream
BufferedInputStream
BufferedOutputStream
PrintStream PushbackInputStream
/* Recuenta el numero de bytes de un fichero.
Se proporciona el nombre como argumento en
linea de comandos. Sino se proporciona fichero se lee
de la entrada estándar (System.in) */
package InputOutput;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
Ejemplo
transformando un valor particular en otro.
Con valores proporcionados desde linea de comandos.
*/
package InputOutput;
import java.io.IOException; >java InputOutput.Ejemplo2 a b
aaaaaaaaaaaaaaaaaaaaaaaa
public class Ejemplo2{ bbbbbbbbbbbbbbbbbbbbbbbb
public static void main(String args[]){
try{
byte desde = (byte)args[0].charAt(0);
byte hacia = (byte)args[1].charAt(0);
fjfjfjfjfjsjsjsjajaaaaa
int b = 0; fjfjfjfjfjsjsjsjbjbbbbb
^Z
while( (b = System.in.read()) != -1)
System.out.write( (b == desde) ? hacia : b);
}catch(IOException e){
System.out.println(e);
}catch(IndexOutOfBoundsException e){
System.out.println(e);
}
}
}
Flujos de caracters
• Clases abstractas Reader y Writer.
– Métodos similares a InputStream y
OutputStream.
• Se diseñaron después de los flujos de bytes
– Dan soporte a las operaciones con caracteres
Unicode.
Writer Reader
BufferedWriter BufferedReader
LineNumberReader
CharArrayWriter
CharArrayReader
FilterWriter FilterReader
PipedWriter PushbackReader
PipedReader
StringWriter
OutputStreamWriter StringReader
InputStreamReader
FileWriter
FileReader
PrintWriter
OutputStreamWriter y
InputStreamReader
• Realizan conversión entre flujos Unicode y flujos de bytes
usando una codificación (o una por defecto).
• InputStreamReader, recibe bytes y produce
caracteres Unicode.
• OutputStreamWriter, recibe caracteres y bytes.
• Por defecto, usan la codificación de la plataforma.
• FileReader y FileWriter son subclases
– Ayudan a la lectura y escritura de archivos locales usando la
codificación Unicode.
• No existen ReaderInputStream ni
WriterOutputStream.
package InputOutput;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.Reader;
}catch(FileNotFoundException e){
System.out.println(e);
}catch(IOException e){
System.out.println(e);
}
}
}
Pushback
• Permite enviar de vuelta caracteres después de leerlos.
• Métodos:
– void unread(char[] cbuf)
– void unread(char[] cbuf, int off, int len)
– void unread(int c)
package InputOutput;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.PushbackInputStream;
import java.io.FileNotFoundException ;
/*busca la secuencia de caracteres iguales
public class Ejemplo5{
public static void main(String args[]){ más largos*/
int max = 0; /*Secuencia más larga encontrada*/
int b; /*byte actual de la secuencia*/
>java InputOutput.Ejemplo5 Entrada.txt
int cnt, b1, maxB = -1;
FileInputStream input = null;
43 veces de f
PushbackInputStream in = null;
try{
input = new FileInputStream(args[0]);
in = new PushbackInputStream( input );
do{
b1 = in.read();
for(cnt = 1 ; (b = in.read()) == b1; )
cnt++;
if( cnt > max ){
max = cnt;
maxB = b1;
}
in.unread(b); /*devuelve el byte al flujo*/
}while(b != -1);
input.close();
in.close();
System.out.println(max + " veces de "+ (char)maxB);
}catch(FileNotFoundException e){
System.out.println(e);
}catch(IOException e){
System.out.println(e);
}
}
}
DataInput y DataOutput
• Los flujos Data soportan entrada/salida
binaria de los tipos de datos primitivos
(boolean, char, byte, short,
int, long, float, y double) así
como para los String.
• Todos estos flujos implementan las
interfaces DataInput o DataOutput,
para la entrada y salida respectivamente.
Ejemplo
• Primero, el programa define algunos valores:
static final String dataFile = "invoicedata";