Taller paso a paso de trabajo con ficheros en JAVA y ECLIPSE. Se emplean clases auxiliares, desarrollo de vectores de objetos y el acceso a métodos desde una clase principal.
1. TALLER
LOGICA DE PROGRAMACION
Carga de datos con Java
Msc.ing.Jose Fabian Diaz Silva
@josefabiandiaz
Muchos programas requieren un tipo de interacción diferente con el usuario que no involucre
la escritura de una serie de parámetros de entrada por medio del teclado. Un ejemplo de este
caso es la carga de datos empleando un archivo, el cual puede contener un gran volumen de
datos y permite gracias a ellos realizar simulaciones más precisas.
En este taller se realizar un ejercicio que involucre la carga de un archivo plano (txt) , una clase
principal y una clase auxiliar que generara los objetos del ejercicio.
1-Creacion de proyecto y clases
Lo primero que es necesario realizar es crear un proyecto que almacene el taller que se
realizara.
File> New >Java Project
Es necesario darle el nombre de “LogicadeProgramacion” al proyecto(en la ventana que
aparece).
2. Cuando el proyecto este creado, será necesario crear una clase para realizar la ejecución de las
acciones que se esperan del taller.
Para ello dar clic derecho sobre el paquete por defecto que aparece dentro del proyecto y
seleccionar la creación de una nueva clase, así como lo indica la imagen.
Es importante indicar en la ventana que aparece para ingresar el nombre que la clase se podrá
ejecutar, para lo cual requiere un método main. La clase llevara el nombre “Bigcity”.
Ya con la clase principal creada es necesario iniciar con la construcción de la clase auxiliar la
cual se llamara “CiudadA”. (se debe seguir el mismo proceso que se empleo para crear la clase
principal, pero sin la presencia del método main).
Atributos y métodos
La clase “CiudadA” tiene 4 atributos, el identificador que permite manejar cada objeto con una
única identidad, un nombre que facilita su interpretación, un atributo que corresponde a la
población que tiene y el nivel de desarrollo de la ciudad especifica(entre 1 y 5).
int identificador;
String nombre;
int poblacion;
int nivel;
Sera necesario crear un constructor para poder iniciar con valores los objetos que se generaran
a partir de la clase, pero Eclipse permite acelerar este desarrollo por medio de una
herramienta que se encuentra dentro de sus opciones. Para generar automáticamente este
3. código realice la acción que indica el grafico y señale los atributos que quiere que sean
incluidos (se recomienda seleccionar todos).
Al finalizar la ejecución se generara el siguiente código.
public CiudadA(int identificador, String nombre, int poblacion, int nivel) {
super();
this.identificador = identificador;
this.nombre = nombre;
this.poblacion = poblacion;
this.nivel = nivel;
}
Posterior a la escritura del constructor se recomienda crear los métodos que permiten
interactuar con los atributos de la clase, tanto para modificar como para retornar sus valores.
Esto se denomina crear los métodos “Beans”. Eclipse permite igualmente generar
automáticamente este código.
4. Después de ejecutar esta acción se consigue este código.
public int getIdentificador() {
return identificador;
}
public void setIdentificador(int identificador) {
this.identificador = identificador;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public int getPoblacion() {
return poblacion;
}
public void setPoblacion(int poblacion) {
this.poblacion = poblacion;
}
public int getNivel() {
return nivel;
}
public void setNivel(int nivel) {
this.nivel = nivel;
}
2-Trabajando desde la clase principal
Estando en la clase principal es necesario prepararla para realizar la lectura de un archivo
plano.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
Primero se debe importar el código para la lectura de archivos, esto se hace por medio de 3
librerías. La primera hace referencia a un buffer el cual va almacenando las líneas que se
encuentran en el archivo y es el que facilita el trabajo con los datos. La segunda (FileReader)es
requerida para crear un objeto que habilite la lectura de un archivo. La ultima (IOException) se
emplea para capturar los posibles errores que se generen en el proceso de lectura del archivo.
Importante: La inclusión de la librería IOException hace necesario la modificación del método
main para que cobije la ejecución de la clase y capture posibles errores de lectura.
public static void main(String[] args) throws IOException{
5. 3-Invocando el archivo plano
En la línea 12, se crea una variable “líneas” que será la variable que almacenara la información
línea a línea que se va leyendo del archivo que se carga.
En la línea 14, se declara un vector llamado VectorFinal, el cual se empleara para almacenar los
datos contenidos en las líneas leídas del archivo plano.
FileReader de la línea 15, es una clase que permite crear una instancia de un archivo, en esta
oportunidad se crea la instancia fundamentada en el archivo “ciudadesC.txt”. Ya con la
instancia creada “Fr”, se realiza la generación de un buffer(línea 16) el cual permite la carga de
los datos del archivo.
Lo primero que se realiza es calcular el número de líneas que se tiene al interior del
archivo(nlineas). Se emplea el método “readLine” al interior de un While y asi se va pasando
línea a línea y contabilizando. Para conocer el número de líneas del archivo se imprime en la
línea 24 el valor de la cuenta. Por último se cierra el archivo en la línea 25.
Posterior a la cuenta del número de líneas que tiene el archivo se inicia el verdadero proceso
del mismo, puesto se realizara la creación de los objetos a partir de cada una de las líneas. En
6. este punto es importante mencionar que el archivo plano almacena un gran número de datos
de ciudades que coinciden con los atributos de la clase auxiliar que se creó.
En la línea 27, se crea un vector de “CiudadA” que permite almacenar los objetos que se
crearan por cada línea del archivo (el número de líneas que se calculo con anterioridad es de
utilidad para definir el tamaño que tendrá el vector). Con la línea 28 y 29 se realiza la misma
operación de apertura y creación de buffer que se explico en la primera parte.
El while se encuentra en la línea 30 y se mantiene ejecutándose mientras el archivo tenga
líneas que leer. Al interior de este while y en la línea 32, se realiza la separación de la línea
leída en un vector(vectorfinal), por medio de un método llamado SPLIT que utiliza un carácter
de separación para determinar cómo separar las líneas(cada línea del archivo plano tiene la
información de una ciudad y cada uno de sus atributos tienen un punto y coma separándolos,
por ello este carácter se emplea dentro del método).
En la línea 33 se crea un objeto llamado “C” que es de tipo CiudadA, es importante observar
que en esta línea se le pasan 4 parámetros al constructor de la clase. Los parámetros son
tomados del “vectorfinal” que se creó a partir de la línea leída(cada parámetro corresponde a
una posición del vector iniciando desde cero y finalizando en 3, aunque no se aprecia en la
imagen). Como algunos de los datos esperados son de tipo entero y al leer se asume que
todos son String es necesario emplear el método “Integer.parseInt()” que toma una cadena y
la transforma al valor entero.
Ya con el objeto “C” creado es necesario almacenarlo en una posición del vector , lo cual se
hace en la línea 34 del ejercicio. Finalizado el proceso en la línea 37 y 38 se cierra tanto el
buffer como el archivo.
Con el vector “CA” lleno ya solo es necesario recorrerlo y con la línea 40 y 41 se realiza este
recorrido, imprimiendo únicamente el nombre de la ciudad.
Importante:
Cuando un objeto queda almacenando dentro de un vector, no es necesario extraerlo para
invocar sus métodos, como se evidencia en la línea 41 y el método “getNombre”.
7. Clase completa
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Bigcity {
/**
* @param args
*/
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
String lineas=""; //se declara vacia al inicio;
String vectorFinal[];
FileReader Fr=new FileReader("C://ciudadesC.txt");
BufferedReader br=new BufferedReader(Fr);
int nlineas=0;
int i=0;
while((lineas=br.readLine())!=null)
{
nlineas++;
}
System.out.println(nlineas);
Fr.close();
CiudadA [] CA=new CiudadA[nlineas];
Fr=new FileReader("C://ciudadesC.txt");
br=new BufferedReader(Fr);
while((lineas=br.readLine())!=null)
{
vectorFinal=lineas.split(";");
CiudadA C=new
CiudadA(Integer.parseInt(vectorFinal[0]),vectorFinal[1],Integer.parseI
nt(vectorFinal[2]),Integer.parseInt(vectorFinal[3]));
CA[i]=C;
i++;
}
br.close();
Fr.close();
for(int y=0;y<nlineas;y++)
System.out.println(CA[y].getNombre());
}
}
Clase auxiliar
public class CiudadA {
int identificador;
String nombre;
int poblacion;
8. int nivel;
public CiudadA(int identificador, String nombre, int poblacion, int
nivel) {
super();
this.identificador = identificador;
this.nombre = nombre;
this.poblacion = poblacion;
this.nivel = nivel;
}
public int getIdentificador() {
return identificador;
}
public void setIdentificador(int identificador) {
this.identificador = identificador;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public int getPoblacion() {
return poblacion;
}
public void setPoblacion(int poblacion) {
this.poblacion = poblacion;
}
public int getNivel() {
return nivel;
}
public void setNivel(int nivel) {
this.nivel = nivel;
}
}