Download File - UCEMA

Document related concepts
no text concepts found
Transcript
Capitulo 12
Archivos de Ingreso y Salida
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
-1
Objetivos
– Clase JFileChooser interfaz gráfica para la selección de
archivos
– Escribir y leer bytes desde y hacia arch, usando
FileOutputStream and FileInputStream.
– Escribir valores de tipo de dato primitivo a un arch y
leerlos usando DataOutputStream and
DataInputStream.
– Escribir y leer textos usando usando PrintWriter y
BufferedReader
– Leer un arch de texto usando Scanner
– Escribir y leer objetos a y desde un arch usando
ObjectOutputStream y ObjectInputStream
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
-2
La clase File
• Para operar con un arch, primero hay que crearlo un
objeto File (from java.io).
File inFile = new File(“sample.dat”);
File inFile = new File
(“C:/SamplePrograms/test.dat”);
Abre un archivo:
sample.dat en el
directorio actual
Abre el arch test.dat del
directorio
C:\SamplePrograms
por compatibilidad aún en windows se usa “/”
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
-3
Algunos métodos de File
if ( inFile.exists( ) ) {
Ver si inFile está
asociada a un arch real
if ( inFile.isFile() ) {
Ver si inFile está
asociada a un arch o no.
Si devuelve falso, es un
directorio
File directory = new
File("C:/JavaProgramas/Ch12");
Listar todos los arch del
en el directorio
C:\JavaProgramas\Ch12
String filename[] = directory.list();
for (int i = 0; i < filename.length; i++) {
System.out.println(filename[i]);
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
retorna un arreglo
de String
4th Ed Chapter N
-4
JFileChooser
Filtro
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
-5
La Clase JFileChooser
• Un objeto javax.swing.JFileChooser permite
seleccionar un arch a través de una GUI
JFileChooser elector = new JFileChooser( );
elector.showOpenDialog(null);
// se le podria pasar un JFrame
Para listar un directorio específico
JFileChooser elector = new JFileChooser("D:/JavaPrograms/Ch12");
elector.showOpenDialog(null);
más gral
String directorioActual = System.getProperty(“user.dir”);
JFileChooser elector = new JFileChooser(directorioActual);
elector.showOpenDialog(null);
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
-6
Obtener información de JFileChooser
int status = chooser.showOpenDialog(null);
// da un entero
if (status == JFileChooser.APPROVE_OPTION) {
JOptionPane.showMessageDialog(null, “Seleccionó Open");
} else { //== JFileChooser.CANCEL_OPTION
JOptionPane.showMessageDialog(null, “Selecionó Cancel");
}
File selectedFile
= chooser.getSelectedFile();
File currentDirectory = chooser.getCurrentDirectory();
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
-7
obtener nombre y path completo
• Usando los métodos de la clase File
• getName()
• getAbsolutePath()
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
-8
Cuadro de selección de arch General
• Otras métodos de JFileChooser
showSaveDialog(null)
Permite especificar el label del botón y el título
showDialog(null, “Compilar”)
showOpenDialog y showSaveDialog son casos
part. de ésta
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
-9
Aplicar un filtro a los Arhivos
• Se puede usar un filtro de archivos (file filter) para
restringir el listado de JFileChooser a los archivos y
directorios que cumplen el criterio de filtro
• Para aplicar un filtro, se puede definir una subclase de la
clase javax.swing.filechooser.FileFilter y dar los
métodos accept y getDescription.
public boolean accept(File file)
public String getDescription( )
• Ver la clase JavaFilter que restringe el listado de los
archivos fuente y directorios
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 10
Acceso de Bajo Nivel File I/O
• Para leer o escribir datos a un arch, debemos
crear uno de los flujos de objetos y unirlo al arch
• Un flujo (stream) es una secuencia de items de
datos, usualmente 8-bit bytes.
• Java tiene dos tipos de flujos: de entrada y de
salida (input stream y output stream)
• Un input stream tiene una fuente desde la cual
vienen los datos, output stream tiene un destino al
cual se envian los datos.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 11
Flujos de bajo nivel File I/O
• FileOutputStream y FileInputStream objetos que
facilitan el acceso al arch
• FileOutputStream permite sacar una secuencia
de bytes
• FileInputStream permite leer en un arreglo de
bytes.
• FileInputStream  entrada  fuente  sólo 1 Byte
• FileOutputStream  salida  destino  sólo 1 Byte
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 12
Ej: Salida bajo nivel File Output
//set up file and stream
File outFile
= new File("sample1.data");
FileOutputStream outStream = new FileOutputStream( outFile );
//data to save
byte[] byteArray = {10, 20, 30, 40, 50, 60, 70, 80};
//write data to the stream
outStream.write( byteArray );
//output done, so close the stream
outStream.close();
// imprescindible
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 13
Ej: Ingreso de bajo nivel
//set up file and stream
File
inFile
= new File("sample1.data");
FileInputStream inStream = new FileInputStream(inFile);
//Array para introducir los datos de acuerdo a la long
int
fileSize = (int)inFile.length();
byte[] byteArray = new byte[fileSize];
//read data in and display them
inStream.read(byteArray);
for (int i = 0; i < fileSize; i++) {
System.out.println(byteArray[i]);
}
//input done, so close the stream
inStream.close();
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 14
Flujos Alto Nivel File I/O
• Datos primitivos se convierten a secuencias de bytes
• FileOutputStream y DataOutputStream se usan para la
salida de tipos de datos primitivos
• FileInputStream and DataInputStream se usan para la
entrada de tipos de datos primitivos
• Para Reconstruir los datos correctamente debemos
conocer el orden en el cual los datos fueron almacenados
y sus tipos
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 15
Establecer DataOutputStream
• Una secuencia estándar para un objeto DataOutputStream
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 16
Ej Salida
import java.io.*;
class Ch12TestDataOutputStream {
public static void main (String[] args) throws IOException {
. . . //set up outDataStream
//write values of primitive data types to the stream
outDataStream.writeInt(987654321);
outDataStream.writeLong(11111111L);
outDataStream.writeFloat(22222222F);
outDataStream.writeDouble(3333333D);
outDataStream.writeChar('A');
outDataStream.writeBoolean(true);
//output done, so close the stream
outDataStream.close();
}
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 17
Establecer un DataInputStream
• La secuencia estándar para DataInputStream:
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 18
Ej Entrada
import java.io.*;
class Ch12TestDataInputStream {
public static void main (String[] args) throws IOException {
. . . //set up inDataStream
//read values back from the stream and display them
System.out.println(inDataStream.readInt());
System.out.println(inDataStream.readLong());
System.out.println(inDataStream.readFloat());
System.out.println(inDataStream.readDouble());
System.out.println(inDataStream.readChar());
System.out.println(inDataStream.readBoolean());
//input done, so close the stream
inDataStream.close();
}
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 19
Leer datos en el orden correcto
• El orden de las operaciones de lectura y escritura deben
coincidir para leer y almacenar datos primitivos
correctamente
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 20
Archivo de Texto entrada y Salida (I/O)
• En vez de almacenar datos primitivos como datos
binarios en un arch, podemos convertirlos y
almacenarlos como String
• Esto permite ver el arch con un editor de texto
• Para la salida como String de un archivo se usan
objetos PrintWriter
• Para el ingreso de datos a un arch de texto
usamos las clases FileReader y BufferedReader
– Desde Java 5.0 (SDK 1.5), se puede usar taa la clase
Scanner para el ingreso de textfiles
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 21
Ej Salida a arch de texto
import java.io.*;
class Ch12TestPrintWriter {
public static void main (String[] args) throws IOException {
//set up file and stream
File outFile = new File("sample3.data");
FileOutputStream outFileStream
= new FileOutputStream(outFile);
PrintWriter outStream = new PrintWriter(outFileStream);
//write values of primitive data types to the stream
outStream.println(987654321);
outStream.println("Hello, world.");
outStream.println(true);
//output done, so close the stream
outStream.close();
}
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 22
Ej Entrada arch de texto
import java.io.*;
class Ch12TestBufferedReader {
public static void main (String[] args) throws IOException {
//Abrir arhivo y flujo
File inFile = new File("sample3.data");
FileReader fileReader = new FileReader(inFile);
BufferedReader bufReader = new BufferedReader(fileReader);
String str;
str = bufReader.readLine();
int i = Integer.parseInt(str);
//procesar el resto de los datos
bufReader.close();
}
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 23
Ej ingreso arch de texto con Scanner
import java.io.*;
class Ch12TestScanner {
public static void main (String[] args) throws IOException {
//abrir el Scanner
Scanner scanner = new Scanner(new File("sample3.data"));
//obtener un entero
int i = scanner.nextInt();
//procesar el resto de acuerdo al tipo de dato
scanner.close();
}
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 24
Objecto File I/O
• Es posible almacenar objetos tan fácilmente como
datos primitivos
• Usamos ObjectOutputStream y ObjectInputStream
para guardar y obtener objetos desde un arch.
• Para grabar objetos de una clase dada, la
declaración de la clase debe incluir la cláusula
implements Serializable.
• Ej
class Person implements Serializable {
. . .
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 25
Grabando Objetos
File
outFile
= new File("objects.data");
FileOutputStream
outFileStream
= new FileOutputStream(outFile);
ObjectOutputStream outObjectStream
= new ObjectOutputStream(outFileStream);
Person person = new Person("Mr. Espresso", 20, 'M');
outObjectStream.writeObject( person );
account1
bank1
= new Account();
= new Bank();
outObjectStream.writeObject( account1 );
outObjectStream.writeObject( bank1
);
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
Se pueden guardar
objetos de distintas
clases
4th Ed Chapter N
- 26
Leyendo Objectos
File
inFile
= new File("objects.data");
FileInputStream
inFileStream
= new FileInputStream(inFile);
ObjectInputStream inObjectStream
= new ObjectInputStream(inFileStream);
Person person
= (Person) inObjectStream.readObject( );
Account account1
= (Account) inObjectStream.readObject( );
Bank
bank1
= (Bank) inObjectStream.readObject( );
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
El tipo debe ser
compatible con
el del objeto
Se debe leer en
el orden
correcto
4th Ed Chapter N
- 27
Guardando y Cargando Arreglos
• En vez de procesar los elementos individualmente,
se puede guardar y cargar todo el arreglo a la vez
Person[] people = new Person[ N ];
//asumir que N tiene un valor
//construir el array persona
. . .
//grabar el array
outObjectStream.writeObject ( people );
//leer el
array
Person[ ] people = (Person[]) inObjectStream.readObject( );
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 28
Problema
Escribir una clase que maneje la Entrada y Salida a
un archivo del objeto Libro de Direcciones:
AddressBook
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 29
Desarrollo
1.
2.
3.
4.
Implementar el constructor y el método setFile
Implementar el método write
Implementar el método read
Finalizar la clase
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 30
Paso 1 Diseño
• identificar los datos miembros y definir el
contructor
• En vez de almacenar objetos Person,
almacenaremos objetos AddressBook usando las
técnicas de I/O de Objectos
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 31
Paso 1 Código
Directory:
Chapter12/Step1
Source Files: AddressBookStorage.java
TestAddressBookStorage.java
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 32
Paso 1 Test
• Incluimos una salida temporal en el método
setFile
• Ejecutar para verificar el funcionamiento de la
clase main y verificar que el método setFile se
llama en forma correcta
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 33
Paso 2 Diseño
• Diseñar e implementar el método write
• El dato miembro filename almacena el
nombre del archivo que guardará el libro de
direcciones
• Crear un objeto ObjectOutputStream desde
el dato miembro filename método write
• El método write propagará una excepción
IOException si fuese disparada
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 34
Paso 2 Código
Directory:
Chapter12/Step2
Source Files: AddressBookStorage.java
TestAddressBookWrite.java
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 35
Paso 2 Test
• Correr el programa varias veces con diferentes tamaños
para el libro de direcciones.
• Verificar que el arch resultante tenga distintos tamaños.
• Todavía no podemos verificar si los datos se han grabado
en forma correcta
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 36
Paso 3 Diseño
• Diseñar e implementar el método read
• El método devuelve un objeto AddressBook leido
desde un archivo (si no se produce ninguna
excepción)
• El método propagará las excepciones IOException
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 37
Paso 3 Código
Directory:
Chapter12/Step3
Source Files: AddressBookStorage.java
TestAddressBookRead.java
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 38
Paso 3 Test
• Debemos verificar que los datos se puedan leer
correctamente.
• Para verificar la operación de lectura el archivo debe existir
• Se crea el archivo para realizar el test grabando primero
los datos usando la clase TestAddressBookWrite
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 39
Paso 4: Finalizar
• Revisar el programa
• Correr las pruebas finales
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter N
- 40