Download Transparencias del Tema 15: Entrada/Salida

Document related concepts
no text concepts found
Transcript
Tema 15: Entrada/Salida
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
–
–
•
Los flujos de bytes
–
–
–
•
•
Unicode (16 bits).
Texto (caracteres legibles como código fuente …).
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
OutputStream
ObjectOutputStream
ByteArrayOutputStream
PipedOutputStream
FileOutputStream
FilterOutputStream
DataOutputStream
BufferedOutputStream
PrintStream
ObjectInput
InputStream
ObjectInputStream
SequenceInputStream
ByteArrayInputStream
PipedInputStream
FileInputStream
FilterInputStream
DataInputStream
BufferedInputStream
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;
public class Ejemplo1{
public static void main(String args[]){
InputStream in = null;
int total = 0;
try{
if(args.length == 0){
in = System.in;
}else{
in = new FileInputStream(args[0]);
}
while( in.read() != -1)
total++;
in.close();
System.out.println(total);
}catch(FileNotFoundException e){
System.out.println("fichero no encontrado "+e);
}catch(IOException e){
System.out.println(e);
}
}
}
/*
Programa que copia su entrada en su salida,
transformando un valor particular en otro.
Con valores proporcionados desde linea de comandos.
*/
package InputOutput;
import java.io.IOException;
public class Ejemplo2{
public static void main(String args[]){
try{
byte desde = (byte)args[0].charAt(0);
byte hacia = (byte)args[1].charAt(0);
int b = 0;
Ejemplo
>java InputOutput.Ejemplo2 a b
aaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbb
fjfjfjfjfjsjsjsjajaaaaa
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
BufferedWriter
CharArrayWriter
FilterWriter
PipedWriter
StringWriter
OutputStreamWriter
FileWriter
PrintWriter
Reader
BufferedReader
LineNumberReader
CharArrayReader
FilterReader
PushbackReader
PipedReader
StringReader
InputStreamReader
FileReader
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
import
import
import
import
java.io.IOException;
java.io.InputStreamReader;
java.io.FileReader;
java.io.FileNotFoundException;
java.io.Reader;
public class Ejemplo3{
public static void main(String args[]){
Reader in
= null;
int cr
= 0;
int total
= 0;
int espacio = 0;
try{
if( args.length == 0){
in = new InputStreamReader(System.in);
}else{
in = new FileReader(args[0]);
}
for(total = 0; (cr = in.read()) != -1 ; total++){
if(Character.isWhitespace((char)cr))
espacio++;
}
in.close();
System.out.println(total + " caracteres, " + espacio + " espacios");
}catch(FileNotFoundException e){
System.out.println(e);
}catch(IOException e){
System.out.println(e);
}
}
}
Filter
• FilterInputStream FilterOutputStream
FilterReader FilterWriter.
• Los flujos de entrada contienen algún otro flujo de entrada
que se usa como fuente de datos básica, posiblemente
transformando los datos o proporcionando funcionalidades
adicionales.
• FilterInputStream por sí sobreescribe todos los
métodos de InputStream.
• Las subclases deberían sobreescribir algunos de estos
métodos y podrían proporcionar métodos y campos
adicionales.
ByteArray, CharArray y
String
• Uso de array de bytes(char) o String como
fuente o destino de los flujos.
• ByteArrayInputStream
• ByteArrayOutputStream
• CharArrayReader
• CharArrayWriter
• StringReader
• StringWriter
Print
• PrintStream añade funcionalidades para
otro flujo de salida, para imprimir la
representación de varios valores de datos de
forma apropiada.
• PrintWriter imprime representaciones
formateadas de objetos para flujos de salida
de texto.
Buffered
• Almacena los datos en un bufer.
• BufferedInputStream, BufferedOutputStream,
BufferedReader y BufferedWriter.
• BufferedInputStream añade funcionalidades para otro flujo
entrada, la habilidad para buferar la entrada y para soporta mark y los
métodos de reset.
• BufferedOutputStream. Esta clase implementa un flujo de
salida buferado.
• BufferedReader lee texto de un flujo de caracteres de entrada,
buferando los caracteres para proporcionar una lectura eficiente de los
caracteres, arrays y líneas.
• BufferedWriter escribe texto para un flujo de salida de
caracteres, buferando los caracteres para proporcionar una escritura
eficiente de un solo caracteres, array y cadenas.
Piped
• PipedInputStream, PipedOutputStream,
PipedReader y PipedWriter.
• PipedInputStream un flujo de entrada conducido
debería conectarse a un flujo de salida conducido. El flujo
de entrada proporciona bytes de datos que son escritos en
un flujo de salida conducido.
• PipedOutputStream es un flujo de salida conectado a
su correspondiente de entrada para crear un conducto de
comunicación.
• PipedReader es un flujo de entrada de caracteres
conducidos.
• PipedWriter es un flujo de caracteres de salida
conducido
LineNumberReader
• Es un flujo de entrada de caracteres buferados que
mantiene el número de líneas.
• Esta clase define los métodos void
setLineNumber(int) y int getLineNumber()
para configurar y obtener la línea actual respectivamente.
• Por defecto, la línea comienza en 0. Este número se
incrementa al leer y puede modificarse con
setLineNumber(int).
• Se considera que una línea termina mediante el carácter
nueva línea ('\n'), un retorno de carro ('\r'), o un retorno
de carro seguido inmediatamente de un ('\n').
/* Este programa imprime el número de línea cuando se encuentra un carácter especificado */
C:\F_Telematica\Texto\Tema15>java InputOutput.Ejemplo4 i .\InputOutput\Entrada.txt
'i 'en linea 2
package InputOutput;
import
import
import
import
C:\F_Telematica\Texto\Tema15>
java.io.IOException;
java.io.FileReader;
java.io.LineNumberReader;
java.io.FileNotFoundException ;
public class Ejemplo4{
public static void main(String args[]){
if( args.length != 2){
throw new IllegalArgumentException("Son necesarios dos argumentos");
}
try{
int igual = args[0].charAt(0);
FileReader archivoEn = new FileReader (args[1]);
LineNumberReader in = new LineNumberReader(archivoEn);
int cr;
boolean seguir = true;
while((cr = in.read()) != -1 && seguir){
if(cr == igual){
System.out.println("'" + (char)cr
+" 'en linea "+ in.getLineNumber());
seguir = false;
}
}
in.close();
if(seguir)
System.out.println("No encontrado");
}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
import
import
import
java.io.IOException;
java.io.FileInputStream;
java.io.PushbackInputStream;
java.io.FileNotFoundException ;
public class Ejemplo5{
public static void main(String args[]){
int max = 0; /*Secuencia más larga encontrada*/
int b;
/*byte actual de la secuencia*/
int cnt, b1, maxB = -1;
FileInputStream input = null;
PushbackInputStream in = null;
/*busca la secuencia de caracteres iguales
más largos*/
>java InputOutput.Ejemplo5 Entrada.txt
43 veces de f
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";
static final double[] prices = { 19.99, 9.99, 15.99, 3.99, 4.99 };
static final int[] units = { 12, 8, 13, 29, 50 };
static final String[] descs = { "Java T-shirt",
"Java Mug",
"Duke Juggling Dolls",
"Java Pin",
"Java Key Chain" };
•
Luego se abre un flujo de salida. Ya que un DataOutputStream puede sólo crearse como una envolvente para un
flujo existente.
out = new DataOutputStream(new
BufferedOutputStream(new FileOutputStream(dataFile)));
•
Se escribe en el flujo de salida.
for (int i = 0; i < prices.length; i ++) {
out.writeDouble(prices[i]);
out.writeInt(units[i]);
out.writeUTF(descs[i]);
}
File
• FileInputStream, FileOutputStream,
FileReader y FileWriter.
• FileInputStream obtiene bytes de entrada de un
fichero en un sistema de ficheros.
• FileOutputStream, es un flujo de salida para escribir
datos a un File o a un FileDescriptor.
• FileReader, clase para leer ficheros de caracteres.
• FileWriter, clase para escribir ficheros de caracteres.
RandomAccessFile
• Son archivos de acceso aleatorio.
– Se comporta como un gran array de bytes almacenados
en el sistema de archivos.
– Con un puntero de archivo.
– Leen bytes desde donde indican el punterio y lo dejan
donde acaba
– Pueden ser de lectura y escritura.
• No es subclase de InputStream,
OutputStream, Reader y
Writer.
Serialización
• Transforma un objeto en un flujo de datos, con la
posibilidad de reconstruirlo posteriormente el objeto.
• Uso: transferencia en la red, guardar en una Base de Datos
• Clases e interfaces asociadas:
–
–
–
–
–
–
Serializable
ObjectOutputStream
ObjectInputStream
ObjectOutput
ObjectInput
Externalizable