Programación orientada a objetos: entrada/salida de datos

Programación orientada a objetos: entrada/salida de datos

Seguimos con nuestro curso de programación, debemos darnos cuenta que toda aplicación tiene como objetivo final comunicarse con el usuario, para comunicarse podemos o bien introducir datos o bien mandar datos, esto en el mundo de la informática es conocido como entrada / salida. Es fundamental para un programa tener la capacidad de interaccionar con el usuario, de ir adaptándose a las necesidades que presente y por supuesto, comunicarle los fallos del sistema o que el propio usuario tenga.

entrada_salida

Un programa orientado a objetos y escrito en Java también debe ser capaz de comunicarse con el usuario, ya sea pidiéndole que introduzca información o bien pedirle que decida acerca de algo que tenga que realizar el programa.

Para comunicarse con el usuario tradicionalmente se usan dos elementos: interfaz de comandos o consola e interfaces gráficas. Nosotros vamos a seguir ampliando nuestra aplicación de gestión de Granjas para pedirle al usuario que aporte información. Para introducir la entrada / salida a nuestra aplicación vamos a desarrollar métodos pensados para trabajar sobre la interfaz de comandos. Por ejemplo, vamos a comenzar con un método para leer datos desde la consola. Este método servirá para leer de consola los nombres de los animales que el usuario vaya introduciendo.

Por ahora lo que nos interesa es que nuestra aplicación tenga datos con los que trabajar, cuando ya tengamos estos datos en nuestra aplicación y ya hayan sido gestionados es hora de devolvérselos al usuario. Por ahora empecemos implementando los siguientes métodos de entrada de información.

Leer información desde la consola de comandos

Vamos a nuestra clase Granja modificada en el artículo en el que añadíamos niveles de acceso y añadimos la siguiente cabecera para el método:

public void leerConsola(){}

Nuestro objetivo es que cuando llamemos a este método y escribamos por consola, nos este pidiendo información hasta que introduzcamos el valor "salir". Por tanto lo primero es declarar un bucle dentro de ese método que nos pida introducir datos mientras se este cumpliendo la condición sea cierta,es decir, que el dato introducido sea distinto de salir. Añadimos el bucle.

public void leerConsola() {    boolean leer = true;    while (leer) {    }}

Nuestro siguiente paso es incorporar algo que nos permita leer lo que el usuario halla introducido. Para ello utilizaremos la clase BufferedReader y añadiremos por tanto los import necesarios a la clase.

import java.io.*;

Añadimos las siguientes lineas a nuestro método:

public void leerConsola() {    boolean leer = true;    while (leer) {        BufferedReader in = new BufferedReader(new InputStreamReader(                System.in));    }}

Cuando ejecutemos esto se nos guardará en la variable in la información que debemos interpretar. Para tratarla pasamos la información de in a un tipo que si sepamos utilizar, en este caso un String.

public void leerConsola() {    boolean leer = true;    while (leer) {        System.out                .print("Introduce un nombre para crear una animal con ese nombre, si introduces 'salir' la recogida de "                        + "datos finalizaran");        BufferedReader in = new BufferedReader(new InputStreamReader(                System.in));        String line = null;        line = in.readLine();    }}

Si nos fijamos tenemos que in.readLine() es un método de nuestro objeto BufferedReader este es un método que nos trasforma lo que hayamos leído a un String con el que podremos hacer la comprobación. Ahora Eclipse nos avisará que tenemos un error.

error_exception

Es un error que por ahora no nos interesa mucho. Lo solucionamos haciendo click en la segunda opción y Eclipse nos modificará el código a algo así:

public void leerConsola() {    boolean leer = true;    while (leer) {        System.out                .print("Introduce un nombre para crear una animal con ese nombre, si introduces 'salir' la recogida de "                        + "datos finalizaran");        BufferedReader in = new BufferedReader(new InputStreamReader(                System.in));        String line = null;        try {            line = in.readLine();        } catch (IOException e) {            e.printStackTrace();        }    }}

Ya tenemos nuestro String, ahora solo nos queda comprobar si es igual a "salir". Tendremos dos opciones:

  1. Si es igual tendremos que poner el "leer" a false y por tanto finalizar el bucle .
  2. Si es diferente a "salir" creamos un nuevo objeto animal y lo añadimos a la lista de animales.

Finalmente el código nos quedaría algo así:

public void leerConsola() {    boolean leer = true;    while (leer) {        System.out                .print("Introduce un nombre para crear una animal con ese nombre, si introduces 'salir' la recogida de "                        + "datos finalizaran");        BufferedReader in = new BufferedReader(new InputStreamReader(                System.in));        String line = null;        try {            line = in.readLine();        } catch (IOException e) {            e.printStackTrace();        }        switch (line) {        case "salir":            leer = false;            break;        default:            animales.add(new Animal(line));            break;        }    }}

Probando nuestro método

Podemos probar el método con la siguiente clase:

public class Application {  public static void main(String[] args) {    Granja g = new Granja("granja1");    g.leerConsola();    g.muestraAnimales();  }}

Si todo ha ido bien al ejecutar debería salir por consola la siguiente información:

Introduce un nombre para crear una animal con ese nombre, si introduces 'salir' la recogida de datos finalizara

Si introducimos la siguiente información, quedando la interfaz de la consola así:

Introduce un nombre para crear una animal con ese nombre, si introduces 'salir' la recogida de datos finalizarapepeIntroduce un nombre para crear una animal con ese nombre, si introduces 'salir' la recogida de datos finalizaramanuelIntroduce un nombre para crear una animal con ese nombre, si introduces 'salir' la recogida de datos finalizaramanoloIntroduce un nombre para crear una animal con ese nombre, si introduces 'salir' la recogida de datos finalizarasalir

Al introducir "salir" la aplicación debería detenerse y sacar por pantalla el nombre de los animales con su peso:

pepe con peso 0manuel con peso 0manolo con peso 0

salida_pantalla_ejemplo1

Si nos fijamos hemos leído los datos que el usuario ha introducido por consola y con este otro método que ya habiamos definido podemos mostrar al usuario como hemos interpretado sus datos.

Este es una de las distintas formas para leer información, hay muchas, por destacar:

  • Leer también desde la aplicación de consola pero utilizando otra clase para leer los datos.
  • Leer desde un fichero.
  • Leer desde una base de datos.
  • Leer desde la interfaz de usuario de una aplicación.

Como vemos hay muchas formas, que intentaremos ir profundizando y detallando todas estas opciones.

Como siempre aquí está el código fuente para que lo probéis.

Para ti
Queremos saber tu opinión. ¡Comenta!