TALLER PROPUESTO
Figura. Diagrama de Pasada
Dado un archivo de datos Cuenta cuya estructura de información es:
Cuenta {
int numero;
String nombre;
int saldo;
String ciudad;
String domicilio;
}
Realizar:
- Lectura
- Gestión de registros (adición, edición, borrado, consulta) en memoria. Cada
dominio de datos de campo debe corresponder a una lista de valores: Lista1
representa dominio de valores de numero, Lista2 representa dominio de valores de
nombre, Lista3 representa dominio de valores de saldo y así sucesivamente. Un
registro representa la intersección de posición de cada lista. Ejemplo: el registro
uno se representa como Lista1 (1)+Lista2 (1)+Lista3 (1)+Lista4 (1)+Lista5 (1).
- Grabar o escribir en el archivo Cuenta una vez terminada la sesión.
N.B Para este taller se recomienda hacer uso de las clases:
FileInputStream : lectura de archivo Cuenta
FileOutputStream : escritura de archivo Cuenta
ArrayList: Listas que representan el dominio de valores de cada campo
CLASE ArrayList
Un ArrayList es un arreglo dinámico. No tiene restricciones de capacidad. Su tamaño se
ajusta de forma dinámica.
• Los elementos dentro de un ArrayList son Objetos. No pueden ser de tipo básico, pero
pueden ser de cualquier tipo de objeto.
• Constructor:
Por defecto:
ArrayList Obj=new ArrayList().
De tipo objeto:
ArrayList <clase> Obj = new ArrayList ( );
Ejemplo:
ArrayList <String > Obj = new ArrayList ( );
• La clase ArrayList forma parte del paquete java.util
METODOS
• int size(). El tamaño actual. Inicialmente, el tamaño de un ArrayList es 0.
• void add(obj). Añade un objeto al final del ArrayList, incrementando su tamaño en 1. obj
es un objeto.
• Object get(N). Devuelve el elemento almacenado a la posición N en el ArrayList.
N tiene que ser un entero entre 0 y size()-1.
• void set(index, obj). Sustituye el elemento en la posición index por el objeto obj.
(index tiene que ser entre 0 y size()-1) dentro del ArrayList, sustituyendo el elemento
previamente almacenado a la posición N. Es equivalente a A[N] = obj para un arreglo A.
• Object remove(index). Elimina el elemento a la posición index (index entre 0 y size()-1).
Devuelve el objeto eliminado. El tamaño del ArrayList disminuye en 1.
• int indexOf(obj). Busca el objeto obj dentro del ArrayList, y si lo encuentra, devuelve la
posición donde lo ha encontrado. Si no, devuelve -1.
TALLER DESARROLLO DE SOFTWARE CON NETBEANS 8.0
PRIMERA PARTE. GESTION DE ARCHIVOS
PRIMER MOMENTO. CREACION DE PROYECTO EN PLATAFORMA NETBEANS
Ejecutar
Seleccionar File>>New Project…
Se va a crear un nuevo proyecto. Seleccionar y picar sobre el icono
Se debe seleccionar Java de la ventana de categorías
Ahora, se selecciona Java Application de tipo de proyecto. Pulsar el Botón Next
Nombre del Proyecto: Archivo
Chequee . Pulsar el Botón Finish
El Netbeans genera la estructura de un proyecto con:
- Paquete de Programas Fuentes(SourcePackages):: archivo
- Programa Principal:: Archivo.java
SEGUNDO MOMENTO. CREACION DE UNA CLASE BASE PARA VALIDAR DATOS
Se debe posiciona sobre el paquete archivo y pulsar el botón derecho del mouse>>opción
new>>Java Class
La clase base sobre la que se va a trabajar se denomina Token, por tanto:
Nombre de la Clase: Token
Pulsar el Botón Finish
La clase Token debe cumplir:
- Definición de Variables
- Método Constructor con un argumento String (String )
- Métodos de la clase como: Titulada, Numero, Parrafo, Fecha
Primer Paso Colocar las bibliotecas de clase (import ) necesarias. La declaración de
bibliotecas de clases se debe colocar antes del public classToken así:
Entonces, coloque antes de la línea public classToken:
import java.text.*;
import java.util.*;
Segundo Paso Colocar Variables. La definición de la variables se deben colocar después
de public classToken {
int i;
boolean es;
StringBuilder B;
String P;
Tercer Pasó Métodos de la clase. Colocar después la declaración de variables lo
siguiente:
// Método que verifica si todos los caracteres son letras letras
boolean soloLetra(String P)
{
es=true;
for(i=0;i<P.length();i++)
if(!Character.isLetter(P.charAt(i)))
{
es=false;
}
return es;
}
// Método que verifica si todos los caracteres son letras minuscula
boolean soloMinuscula(String P)
{
es=true;
for(i=0;i<P.length();i++)
if(!Character.isLetter(P.charAt(i)) || !Character.isLowerCase(P.charAt(i)))
{
es=false;
}
return es;
}
// Método que verifica si todos los caracteres son digitos
boolean soloDigito(String P)
{
es=true;
B=new StringBuilder ();
for(i=0;i<P.length();i++)
if(!Character.isDigit(P.charAt(i)))
{
es=false;
}
return es;
}
boolean soloFecha(String P)
{
DateFormat FormatoFecha=DateFormat.getDateInstance(DateFormat.SHORT, new
Locale("es"));
if (P == null)
return false;
FormatoFecha.setLenient(false);
try {
FormatoFecha.parse(P.trim());
}
catch (ParseException pe)
{
return false;
}
return true;
}
boolean soloTitulada(String P)
{
es=true;
for(i=0;i<P.length() &&es;i++)
if(Character.isLetter(P.charAt(i)))
{
if(i==0) // Si es la primera letra
{
if(!Character.isUpperCase(P.charAt(i)))
es=false;
}
else // No es la primera letra
if(!Character.isLowerCase(P.charAt(i)))
es=false;
}
else
es=false;
return es;
}
boolean parrafoTitulada(String T)
{
String A[]=T.split(" ");
boolean parrafo=true;
for(i=0;i<A.length;i++)
parrafo=parrafo&&soloTitulada(A[i]);
return parrafo;
}
Quedando:
TERCER MOMENTO. CREACIÓN DE ARCHIVO DE DATOS
Sobre el paquete archivo pulsar el botón derecho del mouse>>New>>Other
Seleccionar Categoria>>Other>>File Type>>Empty File
Pulsar el Botón Next
Nombre del Archivo: Cuenta. Pulsar el Botón Finish
Pulsar el Botón Finish
Aparece la ventana de Archivo Vacio(Empty File)
Pegar los registros:
777,Laura Acuña,500000,Bogota,Caracas;888,Martha
Valero,333333,Medellin,Nutibara;999,Mario Contreras,50505050,Cali,Unicentro
Quedando:
Análisis:
- El ultimo registro no termina en ; (punto y coma)
- El ultimo campo posteriormente no tiene , (coma)
CUARTO MOMENTO. CREACION DE LA CLASE ESTRUCTURA DE INFORMACION
Se diseña una clase que solo tenga las variables de la clase Cuenta (numero, nombre,
saldo, ciudad, domicilio) entonces:
Se debe posiciona sobre el paquete archivo y pulsar el botón derecho del mouse>>opción
new>>Java Class
La clase estructura de información sobre la que se va a trabajar se denomina Cuenta, por
tanto:
Nombre de la Clase: Cuenta. Pulsar el Botón Finish
El Netbeans genera:
La definición de la variables se deben colocar después de public class Cuenta {
String numero;
String nombre;
String saldo;
String ciudad;
String domicilio;
Quedando:
QUINTO MOMENTO. ADMINISTRADOR EN MEMORIA DEL ARCHIVO CUENTA
Se diseña una clase que administre en memoria por medio de un ArrayList (cada posición
es un objeto cuenta) los registros del archivo Cuenta entonces:
Se debe posiciona sobre el paquete archivo y pulsar el botón derecho del mouse>>opción
new>>Java Class
El nombre de la clase es Cuentas
Pulsar el botón Finish
Colocar después de package archivo; el siguiente código:
import java.io.*;
import java.util.*;
import javax.swing.*;
Quedando:
Colocar después de public class Cuentas{ lo siguiente:
ArrayList<String > Lista1=new ArrayList();
ArrayList<String > Lista2=new ArrayList();
ArrayList<String > Lista3=new ArrayList();
ArrayList<String > Lista4=new ArrayList();
ArrayList<String > Lista5=new ArrayList();
int i,j,k;
Cuenta C=new Cuenta();
Token T=new Token();
Quedando:
Coloque el puntero del mouse después de la línea Token T=new Token(); si es necesario
inserte una línea.
Pegar los siguientes Métodos para Manipulación de archivos:
boolean lecturaArchivo()
{
StringBuilder linea=new StringBuilder();
File arch=new File ("src/archivo/cuenta");
if(!arch.exists())
{
System.out.println("El archivo no existe");
return false;
}
try
{
FileInputStream in = new FileInputStream(arch);
int c;
while((c=in.read())!=-1){
linea.append((char)c);
}
in.close();
}
catch(IOException e){return false; }
System.out.println(linea);
String A[];
String B[];
A=linea.toString ().split(";");
for(k=0;k<A.length;k++)
{
B=A[k].split(",");
System.out.println(A[k]);
for(i=0;i<B.length;i++)
switch(i)
{
case 0: Lista1.add(B[i]);
break;
case 1: Lista2.add(B[i]);
break;
case 2: Lista3.add(B[i]);
break;
case 3: Lista4.add(B[i]);
break;
case 4: Lista5.add(B[i]);
break;
}
}
return true;
}
void guardarArchivo()
{
boolean primero=false;
StringBuilder B=new StringBuilder();
for(i=0;i<Lista1.size();i++)
{
if(primero)
B.append(";");
primero=true;
registro(B,Lista1,true,i);
registro(B,Lista2,true,i);
registro(B,Lista3,true,i);
registro(B,Lista4,true,i);
registro(B,Lista5,false,i);
}
File arch=new File("src/archivo/cuenta");
try
{
FileOutputStream out = new FileOutputStream(arch);
for(i=0;i<B.toString ().length();i++)
out.write((byte) B.toString ().charAt(i));
out.close();
}
catch(IOException e){ }
}
void registro(StringBuilder H,ArrayList P,boolean coma,int j)
{
H.append(P.get(j));
if(coma)
H.append(",");
}
Quedando:
Abrir una línea en blanco después del método registro
Pegar los siguientes Métodos para validación y captura de datos (registro lógico):
boolean validar()
{
boolean es=true;
es=es && T.parrafoTitulada(C.nombre) && C.nombre.trim().length()>0;
es=es && T.parrafoTitulada(C.ciudad) && C.ciudad.trim().length()>0;
es=es && T.soloDigito(C.saldo) && C.saldo.trim().length()>0;
es=es && C.domicilio.trim().length()>0;
return es;
}
void captura()
{
do
{
C.nombre=JOptionPane.showInputDialog(null,"Nombre: ",C.nombre);
C.ciudad=JOptionPane.showInputDialog(null,"ciudad: ",C.ciudad);
C.saldo=JOptionPane.showInputDialog(null,"saldo: ",C.saldo);
C.domicilio=JOptionPane.showInputDialog(null,"Domicilio: ",C.domicilio);
}
while(!validar());
}
void capturaID()
{
do
{
C.numero=JOptionPane.showInputDialog(null,"numero: ",C.numero);
}
while(!T.soloDigito(C.numero) || C.numero.trim().length()==0);
}
Abrir una línea en blanco después del método CapturaID
Pegar los siguientes Métodos para la gestión de las Listas:
int existe(String cuenta)
{
return Lista1.indexOf(cuenta);
}
void descargar(int k)
{
C.nombre=Lista2.get(k);
C.saldo=Lista3.get(k);
C.ciudad=Lista4.get(k);
C.domicilio=Lista5.get(k);
}
void mostrar()
{
String S="";
S=S+"Numero: "+C.numero+"\n";
S=S+"Nombre: "+C.nombre+"\n";
S=S+"Saldo: "+C.saldo+"\n";
S=S+"Ciudad: "+C.ciudad+"\n";
S=S+"Domicilio: "+C.domicilio+"\n";
JOptionPane.showMessageDialog(null,S);
}
void adicion()
{
capturaID();
if(existe(C.numero)==-1)
{
C.nombre="";
C.saldo="";
C.ciudad="";
C.domicilio="";
captura();
Lista1.add(C.numero);
Lista2.add(C.nombre);
Lista3.add(C.saldo);
Lista4.add(C.ciudad);
Lista5.add(C.domicilio);
}
}
void edicion()
{
capturaID();
k=existe(C.numero);
if(k>-1)
{
descargar(k);
captura();
Lista2.set(k,C.nombre);
Lista3.set(k,C.saldo);
Lista4.set(k,C.ciudad);
Lista5.set(k,C.domicilio);
}
}
void borrar()
{
capturaID();
k=existe(C.numero);
if(k>-1)
{
Lista1.remove(k);
Lista2.remove(k);
Lista3.remove(k);
Lista4.remove(k);
Lista5.remove(k);
}
}
void consulta()
{
capturaID();
k=existe(C.numero);
if(k>-1)
{
descargar(k);
mostrar();
}
}
SEXTO MOMENTO. CREACION DE LA CLASE VISTA
Se diseña una clase que provea la interface grafica para poder realizar las operaciones de
Cuentas mediante un Menú.
Se debe posicionar sobre el paquete archivo y pulsar el botón derecho del
mouse>>opción new>>Java Class
El nombre de la clase es Menu
Pulsar el Botón Finish
Colocar antes de public class Menu {
import javax.swing.*;
El siguiente método se debe colocar después de public class Menu {
void opciones()
{
int i,opc,cuenta;
Cuentas A=new Cuentas();
A.lecturaArchivo();
Object [] valores = {"1. Adicion","2. Borrar","3. Edicion","4. Consulta","5.Salir"};
do
{
String resp=(String ) JOptionPane.showInputDialog(null,"Elija la Opcion", "Entrada
de datos",JOptionPane.QUESTION_MESSAGE, null, valores,valores[0]);
opc=Character.digit(resp.charAt(0),10);
switch(opc)
{
case 1:
A.adicion();
break;
case 2:
A.borrar();
break;
case 3:
A.edicion();
break;
case 4:
A.consulta();
break;
}
}
while(opc!=5);
A.guardarArchivo();
Quedando:
SEPTIMO MOMENTO ACTUALIZAR LA CLASE Archivo.java
Seleccione la clase Archivo.java del proyecto y de doble click
Escriba lo siguiente en // TODO code application logic here
Menu M=new Menu();
M.opciones();
Pulsar la tecla F6 o el botón
El archivo posee los siguientes registros:
Debe adicionar un registro:
111,Pedro Ramirez,2222222,Cartagena,La Popa
Al salir y retornar debe aparecer:
SEGUNDO PARTE. SELECCION DE ARCHIVOS POR MEDIO DE UNA
VENTANA DE DIALOGO (JFileChooser)
PRIMER MOMENTO. ADAPTAR LECTURA Y ESCRITURA DE ARCHIVOS
PARAMETRO FILE
Seleccione el programa java Cuentas del proyecto
Se deben reemplazar los dos métodos de manipulación de archivos como lecturaArchivo()
y guardarArchivo() para que reciba como parámetro un objeto File.
Elimine el método…
Coloque el método boolean lecturaArchivo()…
boolean lecturaArchivo(File arch)
{
StringBuilder linea=new StringBuilder();
if(!arch.exists())
{
System.out.println("El archivo no existe");
return false;
}
try
{
FileInputStream in = new FileInputStream(arch);
int c;
while((c=in.read())!=-1){
linea.append((char)c);
}
in.close();
}
catch(IOException e){return false; }
System.out.println(linea);
String A[];
String B[];
A=linea.toString().split(";");
for(k=0;k<A.length;k++)
{
B=A[k].split(",");
System.out.println(A[k]);
for(i=0;i<B.length;i++)
switch(i)
{
case 0: Lista1.add(B[i]);
break;
case 1: Lista2.add(B[i]);
break;
case 2: Lista3.add(B[i]);
break;
case 3: Lista4.add(B[i]);
break;
case 4: Lista5.add(B[i]);
break;
}
}
return true;
}
Ahora, sitúese en el método método guardarArchivo().
Elimine el método…
Y coloque el método guardarArchivo
void guardarArchivo(File arch)
{
boolean primero=false;
StringBuilder B=new StringBuilder();
for(i=0;i<Lista1.size();i++)
{
if(primero)
B.append(";");
primero=true;
registro(B,Lista1,true,i);
registro(B,Lista2,true,i);
registro(B,Lista3,true,i);
registro(B,Lista4,true,i);
registro(B,Lista5,false,i);
}
try
{
FileOutputStream out = new FileOutputStream(arch);
for(i=0;i<B.toString().length();i++)
out.write((byte) B.toString().charAt(i));
out.close();
}
catch(IOException e){ }
}
SEGUNDO MOMENTO CREACION DE LA CLASE FILTRO
Se debe posiciona sobre el paquete archivo y pulsar el botón derecho del mouse>>opción
new>>Java Class
La clase base sobre la que se va a trabajar se denomina Filtro, por tanto:
Nombre de la Clase: Filtro
Pulsar el Botón Finish
El Netbeans genera:
Una clase publica Filtro que se encuentra en el paquete de clases denominada archivo.
La clase Filtro debe cumplir:
- Definición de Variables
- Extender la clase abstracta FileFilter
- Método Constructor con un argumento String(String)
- Métodos de la clase como: accept , getDescription
Primer Paso Colocar las bibliotecas de clase (import) necesarias. La declaración de
bibliotecas de clases se debe colocar antes del public class Fitro así:
Entonces, coloque
import java.io.*;
antes de la línea public class Filtro
También se debe extender la clase abstracta FileFilter asi:
Entonces después de class Filtro coloque extends javax.swing.filechooser.FileFilter
Segundo Paso Colocar Variables. La definición de la variables String ext; se deben
colocar después de class Filtro extends javax.swing.filechooser.FileFilter{ quedando:
public class Filtro extends javax.swing.filechooser.FileFilter
{
String ext;
}
Tercer Paso. Generar el método constructor.
Después de la declaración del objeto ext se coloca el constructor:
public Filtro(String ext)
{
this.ext = "." + ext;
}
Cuarto Pasó Métodos de la clase. Colocar después del método constructor los siguientes
métodos:
public boolean accept(File f)
{
return f.isDirectory() || f.getAbsolutePath().endsWith(ext);
}
public String getDescription()
{
return "Todos los Archivos con extension "+ext;
}
Quedando:
TERCER MOMENTO ADAPTAR LA CLASE VISTA A LA CLASE FILTRO
Seleccione el programa java Menu del proyecto
Adicione el import para el manejo de archivos:
import java.io.*;
Se debe adaptar la clase Menu al manejo de ventanas y selección de archivos mediante
la clase Filtro y la clase JFileChooser, por tanto, deje la clase Menu asi:
Ahora, coloque las siguientes sentencias como parte de la clase Menu ( o sea después de
la sentencia public Class Menu { )
File file=null;
public void ventana()
{
Filtro filtro=new Filtro("dat");
JFileChooser fileChooser = new JFileChooser();
fileChooser.setCurrentDirectory(new File(System.getProperty("user.dir")));
fileChooser.setFileFilter(filtro);
int result = fileChooser.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION)
{
file = fileChooser.getSelectedFile();
if (file == null)
{
JOptionPane.showMessageDialog(null,"No se ha seleccionado ningua archivo");
}
if (file.getName().equals(""))
{
JOptionPane.showMessageDialog(null,"No se ha seleccionado ningua archivo");
file=null;
}
if(!filtro.accept(file))
{
JOptionPane.showMessageDialog(null,"El Archivo no es cuenta.dat");
file=null;
}
if (file.exists()) {
JOptionPane.showMessageDialog(null,"\n Nombre del Archivo: " + file.getName()+"\n
Camino : " + file.getPath()+("\n Camino Absoluto : " + file.getAbsolutePath()+"\n
Modificable : " + file.canWrite()+"\n Lectura : " + file.canRead()+"\n Longitud
: " + file.length() + " Bytes"));
}
else
file=null;
}
}
void opciones()
{
int i,opc,cuenta;
Cuentas A=new Cuentas();
ventana();
if(file!=null)
A.lecturaArchivo(file);
else
file=new File ("src/archivo/Cuenta.dat");
Object [] valores = {"1. Adicion","2. Borrar","3. Edicion","4. Consulta","5.Salir"};
do
{
String resp=(String) JOptionPane.showInputDialog(null,"Elija la Opcion", "Entrada
de datos",JOptionPane.QUESTION_MESSAGE, null, valores,valores[0]);
opc=Character.digit(resp.charAt(0),10);
switch(opc)
{
case 1:
A.adicion();
break;
case 2:
A.borrar();
break;
case 3:
A.edicion();
break;
case 4:
A.consulta();
break;
}
}
while(opc!=5);
A.guardarArchivo(file);
}
Quedando:
Limpiar el error y construir…..
CUARTO MOMENTO RENOMBRAR EL ARCHIVO DE DATOS CON UN NOMBRE Y
EXTENSION
Seleccione el archivo de datos Cuenta del proyecto y pulsar el botón derecho del ratón y
seleccione la opción Rename (Renombrar)
Se abre una ventana, en la caja de texto coloque Cuenta.dat
Pulsar el Boton Aceptar
Pulsar la tecla F6 o el botón
Cerrar la ventana de ejecución (Output)-Archivo(run):
Cerrar el proyecto:
Sobre el nombre del proyecto (Archivo)>>Botón derecho del Mouse>>Opción Close