Programación interactiva Oscar Bedoya
[email protected]
Archivos
Archivos Clase File
• Resulta útil para recuperar información acerca de un archivo o directorio, entre la que se encuentra -Longitud del archivo en bytes -Fecha y hora de la última modificación -La ruta absoluta -En caso de ser un directorio, se puede conocer una lista con los nombres de archivos que contiene Además, cuando se tiene solo una referencia a un archivo o un directorio, se puede conocer cuál de los dos es. También se puede saber si realmente existe tal archivo o directorio
Archivos Método
Descripción
boolean canRead()
Devuelve true si se puede leer el archivo, en caso contrario devuelve false
boolean canWrite()
Devuelve true si se puede escribir el archivo, en caso contrario devuelve false
boolean exists()
Devuelve true si el nombre especificado como argumento en el constructor de File es un archivo o un directorio; en caso contrario devuelve false
boolean isFile()
Devuelve true si el nombre especificado como argumento en el constructor es un archivo
boolean isDirectory()
Devuelve true si el nombre especificado como argumento en el constructor es un directorio
String getAbsolutePath()
Devuelve un String con la ruta absoluta del archivo o directorio
String getName() long length() long lastModified() String[] List()
Devuelve un String con el nombre del archivo o directorio Devuelve la longitud de un archivo en bytes. Si el objeto File representa a un directorio, se devuelve 0 Devuelve una representación de la hora en la que se hizo la última modificación Devuelve un arreglo de cadenas que representan el contenido del directorio. Devuelve null si el objeto File no es un directorio
Archivos Clase File
• Los objetos File no abren archivos ni proporcionan herramientas para procesar archivos • Realmente, los objetos File se utilizan frecuentemente con objetos de otras clases de java.io para especificar los archivos o directorios que se van a manipular
Archivos • Para crear un objeto de la clase File se especifica el nombre del archivo o directorio que se quiere asociar File objeto = new File(“datos.txt”); • En caso de que el archivo se encuentre dentro de un directorio, se utiliza un constructor que tiene dos parámetros, la ruta y el nombre del archivo File objeto = new File(“interativa/”, “ejemplo.dat”);
Archivos • Para especificar un directorio se pasa su nombre al constructor
File objeto = new File(“directorio”);
Archivos Para leer el contenido de un archivo se debe tener en cuenta lo siguiente: • La clase FileReader se puede utilizar para abrir un archivo • Sin embargo, la clase FileReader no sabe cómo leer líneas de texto • La clase BufferedReader proporciona la funcionalidad de leer líneas de texto, pero no sabe cómo abrir un archivo • Se deben utilizar las clases FileReader y BufferedReader en conjunto para leer la información contenida en un archivo. Esto se conoce como envoltura de objetos de flujo
Archivos Para envolver un objeto FileReader en un objeto BufferedReader se pasa el objeto FileReader al constructor de BufferedReader BufferedReader entrada=new BufferedReader(new FileReader(objeto));
Luego, se puede usar la referencia entrada para leer del archivo
Archivos El archivo se lee por líneas. El método readLine devuelve en un String el contenido de la línea y avanza a la siguiente línea. En caso de que llegue al final del archivo, readLine devuelve null File objeto = new File(“datos.txt”);
BufferedReader entrada=new BufferedReader(new while ((texto=entrada.readLine()) != null ) areatexto.append("\n" +
texto );
FileReader(objeto));
Archivos
PruebaFile
Archivos
Si es un archivo se muestra la ruta, la ruta absoluta y el contenido del archivo
String nombreArchivo = campo.getText(); File objeto = new File(nombreArchivo);
if ( objeto.exists() ) { areatexto.setText("\nRuta:” + objeto.getPath() + "\nRuta absoluta: " + objeto.getAbsolutePath() ); if ( objeto.isFile() ) { try { BufferedReader entrada = new BufferedReader(new FileReader( objeto ) ); String texto; areatexto.append( "\n\nCONTENIDO DEL ARCHIVO: \n" );
while ( ( texto = entrada.readLine() ) != null ) areatexto.append("\n" + texto ); } catch( IOException excepcion ) { JOptionPane.showMessageDialog( this, "ERROR EN ARCHIVO", "ERROR EN ARCHIVO", JOptionPane.ERROR_MESSAGE ); } }
String nombreArchivo = campo.getText(); File objeto = new File(nombreArchivo);
Se utilizan los métodos de la clase File
if ( objeto.exists() ) { areatexto.setText("\nRuta:” + objeto.getPath() + "\nRuta absoluta: " + objeto.getAbsolutePath() ); if ( objeto.isFile() ) { try { BufferedReader entrada = new BufferedReader(new FileReader( objeto ) ); String texto; areatexto.append( "\n\nCONTENIDO DEL ARCHIVO: \n" );
while ( ( texto = entrada.readLine() ) != null ) areatexto.append("\n" + texto ); } catch( IOException excepcion ) { JOptionPane.showMessageDialog( this, "ERROR EN ARCHIVO", "ERROR EN ARCHIVO", JOptionPane.ERROR_MESSAGE ); } }
Archivos
Si es un directorio, se muestra su contenido
if ( objeto.isDirectory() ) { String directorio[] = objeto.list();
areatexto.append( "\n\nContenido del directorio:\n");
}
for ( int i = 0; i < directorio.length; i++ ) areatexto.append( directorio[ i ] + "\n" );
El método list devuelve un arreglo de Strings con los nombres de los subdirectorios y archivos. Se muestra cada elemento del arreglo
Archivos Manejo de archivos con RandomAccessFile
La clase RandomAccessFile proporciona todas las herramientas de las clases FileInputStream, FileOutputStream, DataInputStream y DataOutputStream que permiten escribir en un archivo
Archivos • Para abrir un archivo por medio de la clase RandomAccessFile se pasa al constructor el nombre del archivo y el tipo de permiso RandomAccessFile archivo= new RandomAccessFile(nombre, permiso);
donde permiso es un String que puede ser “r” para indicar que es de solo lectura, “w” para escritura y “rw” para lectura y escritura
Archivos • Para leer de un archivo por medio de la clase RandomAccessFile se utiliza el método readLine() String linea; linea = archivo.readLine();
Archivos Problema: Desarrollar un traductor de tal forma que las palabras se almacenen en un archivo. El proceso de búsqueda de una palabra se realiza sobre el archivo
TraductorX
Archivos Problema: Desarrollar un traductor de tal forma que las palabras se almacenen en un archivo. El proceso de búsqueda de una palabra se realiza sobre el archivo
El formato que se selecciona para almacenar los datos, consiste en colocar la palabra en español, seguido del carácter “#” y luego la palabra en inglés
Archivos Problema: Desarrollar un traductor de tal forma que las palabras se almacenen en un archivo. El proceso de búsqueda de una palabra se realiza sobre el archivo
TraductorX
El formato que se selecciona para almacenar los datos, consiste en colocar la palabra en español, seguido del carácter “#” y luego la palabra en inglés
Archivos • La clase StringTokenizer permite descomponer un String en tokens. Se pasa al constructor una cadena de caracteres y el símbolo que separa los tokens
StringTokenizer tokens = new StringTokenizer(linea,simbolo); • Para conocer el siguiente token, se utiliza el método nextToken() actual = tokens.nextToken(); • Para saber si se tienen más tokens se hace;
tokens.hasMoreTokens()
Archivos Suponga que se tiene lo siguiente: String linea = “LIBRO#BOOK”; StringTokenizer tokens = new StringTokenizer(linea,”#”); System.out.println( tokens.nextToken() ); System.out.println( tokens.nextToken() ); Muestra los dos tokens LIBRO y BOOK
Archivos
Se toma la palabra del campo de texto TFPalabra y se compara con el primer token de la línea. Si coinciden se muestra el siguiente token, sino, se avanza a la siguiente línea
String linea = new String(); String palabra = TFPalabra.getText();
try{ RandomAccessFile archivo = new RandomAccessFile("data.txt", "r"); linea = archivo.readLine(); int encontrado=0; while(linea!=null && encontrado==0){
StringTokenizer tokens = new StringTokenizer(linea, "#"); while (tokens.hasMoreTokens()){ String actual = tokens.nextToken();
} }
if (actual.equals(palabra.toUpperCase()) ){ encontrado=1; TFTraduccion.setText(tokens.nextToken()); } else linea=archivo.readLine();
Se crea un objeto de RandomAccessFile para leer del archivo
String linea = new String(); String palabra = TFPalabra.getText();
try{ RandomAccessFile archivo = new RandomAccessFile("data.txt", "r"); linea = archivo.readLine(); int encontrado=0; while(linea!=null && encontrado==0){
StringTokenizer tokens = new StringTokenizer(linea, "#"); while (tokens.hasMoreTokens()){ String actual = tokens.nextToken();
} }
if (actual.equals(palabra.toUpperCase()) ){ encontrado=1; TFTraduccion.setText(tokens.nextToken()); } else linea=archivo.readLine();
• Si el token coincide con la palabra a traducir se muestra en el campo de texto. • Sino, se avanza a la siguiente línea
Archivos Incorporando JFileChooser para el manejo de archivos
Archivos + data.txt
Archivos Para mostrar el cuadro de dialogo se utiliza el método showOpenDialog JFileChooser selectorArchivo = new JFileChooser(); int resultado = selectorArchivo.showOpenDialog(this); if (resultado == JFileChooser.CANCEL_OPTION) System.out.println("No seleccionó ningun archivo");
if (resultado == JFileChooser.APPROVE_OPTION) File nombreArchivo=selectorArchivo.getSelectedFile();
Archivos Para mostrar el cuadro de dialogo se utiliza el método showOpenDialog JFileChooser selectorArchivo = new JFileChooser(); int resultado = selectorArchivo.showOpenDialog(this); if (resultado == JFileChooser.CANCEL_OPTION) System.out.println("No seleccionó ningun archivo");
if (resultado == JFileChooser.APPROVE_OPTION) //procesar informacion
El método showOpenDialog devuelve un número entero. Para saber si se hizo clic en Cancelar se utiliza la constante JFileChooser.CANCEL_OPTION y cuando se selecciona un archivo se tiene la constante JFileChooser.APPROVE_OPTION
JFileChooser selectorArchivo= new JFileChooser(); int resultado = selectorArchivo.showOpenDialog(this);
if (resultado == JFileChooser.CANCEL_OPTION) System.out.println("No seleccionó ningún archivo"); if (resultado == JFileChooser.APPROVE_OPTION) { File nombreArchivo = selectorArchivo.getSelectedFile() ;
Se muestra el FileChooser. Se considera el caso en que no seleccione ningún archivo
if (nombreArchivo==null || nombreArchivo.getName().equals("")) JOptionPane.showMessageDialog(null, "Nombre de archivo incorrecto”); else { try { RandomAccessFile r = new RandomAccessFile( nombreArchivo , "r"); String linea=r.readLine(); while (linea!=null){ areatexto.append("\n" + linea); datos.addElement(linea); linea = r.readLine(); } r.close();
}
}
} catch(IOException e){ System.out.println("Error al abrir el archivo"); }
JFileChooser selectorArchivo= new JFileChooser(); int resultado = selectorArchivo.showOpenDialog(this); if (resultado == JFileChooser.CANCEL_OPTION) System.out.println("No seleccionó ningún archivo"); if (resultado == JFileChooser.APPROVE_OPTION) { File nombreArchivo = selectorArchivo.getSelectedFile() ;
Se maneja el caso en que no escriba un nombre de archivo válido
if (nombreArchivo==null || nombreArchivo.getName().equals("")) JOptionPane.showMessageDialog(null, "Nombre de archivo incorrecto”); else { try { RandomAccessFile r = new RandomAccessFile( nombreArchivo , "r"); String linea=r.readLine(); while (linea!=null){ areatexto.append("\n" + linea); datos.addElement(linea); linea = r.readLine(); } r.close();
}
}
} catch(IOException e){ System.out.println("Error al abrir el archivo"); }
JFileChooser selectorArchivo= new JFileChooser(); int resultado = selectorArchivo.showOpenDialog(this); if (resultado == JFileChooser.CANCEL_OPTION) System.out.println("No seleccionó ningún archivo"); if (resultado == JFileChooser.APPROVE_OPTION) { File nombreArchivo = selectorArchivo.getSelectedFile() ; if (nombreArchivo==null || nombreArchivo.getName().equals("")) JOptionPane.showMessageDialog(null, "Nombre de archivo incorrecto”); else { try { RandomAccessFile r = new RandomAccessFile( nombreArchivo , "r"); String linea=r.readLine(); while (linea!=null){ areatexto.append("\n" + linea); datos.addElement(linea); linea = r.readLine(); } r.close();
}
}
Cada línea del archivo se guarda temporalmente en un vector
} catch(IOException e){ System.out.println("Error al abrir el archivo"); }
Archivos
Procesar muestra la información del archivo separando cada línea que lo compone por el carácter “-”
if (evento.getSource()==procesar) { areatexto.append("\n\n * Análisis *\n");
}
for (int i=0 ; i