• No se han encontrado resultados

Programación interactiva. Oscar Bedoya

N/A
N/A
Protected

Academic year: 2021

Share "Programación interactiva. Oscar Bedoya"

Copied!
52
0
0

Texto completo

(1)

Oscar Bedoya

[email protected]

(2)
(3)

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

(4)

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() Devuelve un String con el nombre del archivo o directorio

long length() Devuelve la longitud de un archivo en bytes. Si el objeto File representa a un directorio, se devuelve 0

long lastModified() Devuelve una representación de la hora en la que se hizo la última modificación

String[] List() Devuelve un arreglo de cadenas que representan el contenido del directorio. Devuelve null si el objeto File no es un directorio

(5)

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

(6)

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

(7)

Para especificar un directorio se pasa su nombre al constructor

File objeto = new File(“directorio”);

(8)

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

(9)

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

(10)

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 FileReader(objeto)

);

while ((texto=entrada.readLine()) != null )

areatexto.append("\n" + texto );

(11)

Archivos

(12)

Archivos

Si es un archivo se

muestra la ruta, la

ruta absoluta y el

contenido del archivo

(13)

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 ); }

(14)

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 ); }

}

Se utilizan los métodos

de la clase File

(15)

Archivos

Si es un directorio, se

muestra su contenido

(16)

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

(17)

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

(18)

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

(19)

Para leer de un archivo por medio de la clase RandomAccessFile se

utiliza el método readLine()

String linea;

linea = archivo.readLine();

(20)

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

(21)

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

(22)

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

(23)

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()

(24)

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

(25)

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

(26)

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

(27)

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

(28)

Archivos

Incorporando JFileChooser para el manejo de archivos

Archivos +

data.txt

(29)

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)

(30)

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

(31)

JFileChooserselectorArchivo= 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(); }

catch(IOException e){ System.out.println("Error al abrir el archivo"); } }

}

Se muestra el FileChooser. Se

considera el caso en que no

(32)

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(); }

catch(IOException e){ System.out.println("Error al abrir el archivo"); } }

}

Se maneja el caso en que

no escriba un nombre de

(33)

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(); }

catch(IOException e){ System.out.println("Error al abrir el archivo"); } }

}

Cada línea del archivo se

guarda temporalmente

(34)

Archivos

Procesar muestra la información

del archivo separando cada línea

que lo compone por el carácter “-”

(35)

if (evento.getSource()==procesar) {

areatexto.append("\n\n * Análisis *\n"); for (int i=0 ; i<datos.size() ; i++) {

String linea = (String.valueOf(datos.elementAt(i))); areatexto.append(" - " + linea);

} }

(36)

Archivos

Guardar los cambios efectuados en

el área de texto. Se pueden

adicionar más palabras para

(37)

Archivos

Una forma de almacenar datos en un archivo es por medio de un flujo

(PrintStream)

Se declara el flujo

PrintStream flujoSalida = null;

Se muestra el dialogo para guardr el archivo

int resultado = selectorArchivo.showSaveDialog(this);

Se guardar en un objeto File el nombre del archivo

File nombreArchivo = selectorArchivo.getSelectedFile();

Se crea el flujo de salida

(38)

Archivos

Una forma de almacenar datos en un archivo es por medio de un flujo

(PrintStream)

Se declara el flujo

PrintStream flujoSalida = null;

Se muestra el dialogo para guardr el archivo

int resultado = selectorArchivo.

showSaveDialog

(this);

Se guarda en un objeto File el nombre del archivo

File nombreArchivo = selectorArchivo.getSelectedFile();

Se crea el flujo de salida

(39)

Archivos

Una forma de almacenar datos en un archivo es por medio de un flujo

(PrintStream)

Para escribir en el flujo se utiliza el método println

flujoSalida.println( areatexto.getText() );

Cuando se termine de escribir, se debe cerrar el archivo

flujoSalida.close();

Archivos

(40)

Archivos

Problema

: Desarrollar una aplicación Java que permita manejar los datos

de los estudiantes. La aplicación debe permitir la búsqueda, adición y

consulta de los estudiantes. La información se debe almacenar en un

archivo

Archivos1 +

estudiantes.txt

(41)

Archivos

Considere el siguiente formato para almacenar la información de los

estudiantes.

(42)

Archivos

Para la búsqueda, se digita el código y se oprime Buscar.

Se busca en el archivo llamado estudiantes.txt

-En caso de que se encuentre, se completan los

campos de textos con la información respectiva

-Si no se encuentra se muestra un mensaje

Archivos1

(43)

Archivos

Para adicionar los datos de un nuevo estudiante, se utilizará ahora una

forma alternativa de escribir en un archivo

Se hará completamente utilizando la clase RandomAccesseFile.

Específicamente, utilizando un método que permite ubicarse en la

última línea del mismo para escribir allí

(44)

Archivos

Crear la referencia al archivo

RandomAccessFile file = new RandomAccessFile("estudiantes.txt", "rw");

Ubicarse en el ultimo registro del archivo

file.

seek

(file.length());

Escribir en el archivo

file.

writeBytes

(datosEstudiante);

Cerrar el archivo

(45)

Archivos

Crear la referencia al archivo

RandomAccessFile file = new RandomAccessFile("estudiantes.txt", "rw");

Ubicarse en el ultimo registro del archivo

file.

seek

(file.length());

Escribir en el archivo

file.

writeBytes

(datosEstudiante);

Cerrar el archivo

file.close();

•seek

permite ubicarse en la

posición indicada

•writeBytes

permite escribir

en un archivo RandomAccessFile

(46)

Archivos

Cuando un programa necesita manipular el conjunto de datos

almacenado previamente en un archivo, resulta más eficiente hacer una

copia del archivo en un Vector

Cuando inicia la aplicación se copia la información a un vector, se

realizan las modificaciones sobre el vector y cuando el usuario vaya a

cerrar la aplicación, se pasa el contenido del vector al archivo

Actualizar y Eliminar son

operaciones que requieren

mayor control sobre el

conjunto de datos

(47)

public class Estudiante

{

private String codigo, nombre; private int edad;

private double promedio;

public Estudiante(String c, String n, int e, double p){ codigo = c;

nombre = n; edad = e; promedio = p; }

public String obtenerCodigo(){ return codigo; }

public String obtenerNombre(){ return nombre;

}

public int obtenerEdad(){ return edad; }

public double obtenerPromedio(){ return promedio; }

}

Estudiante String codigo, nombre; int edad;

double promedio; Estudiante()

public String obtenerCodigo() public String obtenerNombre() public int obtenerEdad()

(48)

unEstudiante 10066043 Sarah Meyer 25 4.5 unEstudiante 6106787 OsCaR 27 4.6 unEstudiante 9709555 Sophie 18 4.0 datos

(49)

public void cargarDatos() {

try{

RandomAccessFile file = new RandomAccessFile("estudiantes.txt", "r"); String linea = file.readLine();

while(linea!=null){

StringTokenizer tokens = new StringTokenizer(linea, "\t"); while (tokens.hasMoreTokens()){

String codigo = String.valueOf(tokens.nextToken()); String nombre = String.valueOf(tokens.nextToken()); int edad = Integer.parseInt(tokens.nextToken());

double promedio = Double.parseDouble(tokens.nextToken());

Estudiante objeto = new Estudiante(codigo, nombre, edad, promedio);

datos.addElement(objeto); }

linea=file.readLine(); }

}

catch(IOException e){ System.out.println("Error al abrir el archivo"); }

}

Se llama a este método

en el constructor

(50)

Archivos

Adicionar un estudiante

consiste en agregarlo al vector

Archivos2

(51)

public static void guardarDatos() {

try{

flujo= new PrintStream(new FileOutputStream("estudiantes.txt") ); }

catch (IOException e) { System.out.println("Error al abrir el archivo"); } try{

for (int i=0 ; i<datos.size() ; i++) { String linea; linea = ((Estudiante)datos.elementAt(i)).obtenerCodigo() + "\t" + ((Estudiante)datos.elementAt(i)).obtenerNombre() + "\t" + ((Estudiante)datos.elementAt(i)).obtenerEdad() + "\t" + ((Estudiante)datos.elementAt(i)).obtenerPromedio() ; flujo.println(linea); }

} catch(Exception e) {System.out.println("Error al abrir el archivo");} flujo.flush();

flujo.close();

}

Para guardar los datos, se escribe,

línea por línea, el contenido del

(52)

public static void main(String[] args) {

Archivos2 aplicacion = new Archivos2(); WindowListener l = new WindowAdapter() {

public void windowClosing(WindowEvent e) { guardarDatos(); System.exit(0); } }; aplicacion.addWindowListener(l); aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); }

Se modifica el método

windowClosing para que haga el

llamado al método

guardarDatos

()

Referencias

Documento similar

DS N° 012-2014-TR Registro Único de Información sobre accidentes de trabajo, incidentes peligrosos y enfermedades ocupacionales y modificación del art.110º del Reglamento de la Ley

4.- Los elementos de un array se inicializan al valor por defecto del tipo correspondiente (cero para valores numéricos, el carácter nulo par char, false para boolean, null para

Cedulario se inicia a mediados del siglo XVIL, por sus propias cédulas puede advertirse que no estaba totalmente conquistada la Nueva Gali- cia, ya que a fines del siglo xvn y en

Esto viene a corroborar el hecho de que perviva aún hoy en el leonés occidental este diptongo, apesardel gran empuje sufrido porparte de /ue/ que empezó a desplazar a /uo/ a

Ciaurriz quien, durante su primer arlo de estancia en Loyola 40 , catalogó sus fondos siguiendo la división previa a la que nos hemos referido; y si esta labor fue de

1. LAS GARANTÍAS CONSTITUCIONALES.—2. C) La reforma constitucional de 1994. D) Las tres etapas del amparo argentino. F) Las vías previas al amparo. H) La acción es judicial en

A diferencia del comando cadena.inicia_con, este comando nos permite buscar en una cadena de texto si esta termina con un carácter especificado y devuelve un valor buelano. Este

Pero antes hay que responder a una encuesta (puedes intentar saltarte este paso, a veces funciona). ¡Haz clic aquí!.. En el segundo punto, hay que seleccionar “Sección de titulaciones