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