Download Programación Orientada a Objetos Proyecto Curricular de
Document related concepts
no text concepts found
Transcript
9 - Entrada y salida de datos estándar Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas Entrada y salida de datos estandar Normalmente, cuando se codifica un programa, se hace con la intención de que ese programa pueda interactuar con los usuarios del mismo, es decir, que el usuario pueda pedirle que realice cosas y pueda suministrarle datos con los que se quiere que haga algo. Una vez introducidos los datos y las órdenes, se espera que el programa manipule de alguna forma esos datos para proporcionarnos una respuesta a lo solicitado. A todas estas operaciones, que constituyen un flujo de información del programa con el exterior, se les conoce como Entrada/Salida (E/S). Existen dos tipos de E/S; la E/S estándar que se realiza con el terminal del usuario y la E/S a través de fichero, en la que se trabaja con ficheros de disco, en esta guía solo se tratara el primero, posteriormente se hablara del segundo. Todas las operaciones de E/S en Java vienen proporcionadas por el paquete estándar de la API de Java denominado java.io que incorpora interfaces, clases y excepciones para acceder a todo tipo de ficheros. En este guia sólo se van a dar algunas pinceladas de la potencia de este paquete. Para los siguientes ejemplos ya tenemos casi todo discutido, excepto que por cuestiones educativas sería interesante que el programa no solo contenga los valores que interactuarán almacenados, sino que también sea posible preguntar al usuario, ya se conoce una forma que es mediante la clase JOptionPane ahora se vera como se hace de forma estándar o también llamada por consola. Es bueno resalta que para las maratones de programación la captura y entrega de datos resultantes se realiza por entrada y salida estándar System.out El objeto System es parte de la biblioteca de Java y es instanciado o fabricado al iniciar la JVM (Java Virtual Machin) mucho antes que se comience a ejecutar nuestro programa. Este almacena 3 objetos, son out, in y err. El objeto out es del tipo o clase Printstream que tiene las siguientes propiedades y métodos importantes, no listaremos todos: Resumen de Métodos boolean checkError() Envía todo el buffer y devuelve verdadero si hay error o falso. void close() Cierra el flujo de datos void flush() Envía todo el buffer. void print(boolean b) Imprime una variable booleana void print(char c) Imprime un caracter. void print(char[] s) Imprime un arreglo de caracteres. void print(double d) Imprime un numero de tipo double. void print(float f) Imprime un número de punto flotante. void print(int i) Imprime un entero. void print(long l) Imprime un entero largo. void print(Object obj) Imprime un objeto, invocando su función toString() void print(String s) Imprime un objeto de tipo String void println() Imprime una separador de nueva línea. void println(boolean x) Imprime un valor booleano y termina la línea. void println(char x) Imprime un caracter y termina la línea. void println(char[] x) Imprime un arreglo de caracteres y termina la línea. void println(double x) Imprime un número de precisión doble y termina la línea. void println(float x) Imprime un número de punto flotante y termina la línea. void println(int x) Imprime un entero y termina la línea. void println(long x) Imprime un entero largo y termina la línea. void println(Object x) Imprime un objeto invocando su método toString() y termina la línea. void println(String x) termina la línea. Imprime un trozo de texto y System.in El objeto in que es una propiedad de System es de la clase o tipo InputStream, que también es parte de la biblioteca de Java. Aquí vemos los métodos que nos interesan. Resumen de Métodos int available() Devuelve la cantidad de bytes que se pueden leer (o pasar por alto) desde esta entrada sin bloquear la próxima llamada a lectura. void close() Cierra esta entrada de datos y libera todos los recursos asociados. abstract int read() Lee el próximo byte entrada, espera por los datos. int read(byte[] b) Lee de la entrada los bytes que llenan el arreglo b, devuelve la cantidad de bytes que se almacenaron. int read(byte[] b, int off, int len) Lee hasta len bytes de datos adentro del arreglo de bytes b empezando en off. de datos desde la long skip(long n) Salta y destrulle los n caracteres de datos. System.err Este objeto es del mismo tipo que out (Printstream) y tiene las mismas propiedades, en los sistemas operativos derivados de Unix como sor Linux, no existe mucha diferencia entre salida estándar de datos (System.out) y la salida estándar de errores (System.err). System.exit(int cod); El método estático exit(cod) de la clase System interrumpe la ejecución total del programa y devuelve el control al sistema operativo, es decir la JVM (Java Virtual Machin) termina por completo liberando los recursos. Un código de salida igual a cero es considerado como una ejecución satisfactoria del programa, un código diferente a este, se considera un error y sirve para que el sistema operativo u otro programa que llame al nuestro sepan de alguna manera que ocurrió. A continuación vemos un ejemplo del uso de estas funciones que acepta texto hasta que se pulsa el retorno de carro e informa del número de caracteres introducidos. import java.io.*; class CuentaCaracteres { public static void main(String args[]) throws IOException { int contador=0; while(System.in.read()!='\n') contador++; System.out.println(); // Retorno de carro "gratuito" System.out.println("Tecleados "+contador+" caracteres."); } } Los objetos System.in y System.out La entrada/salida estándar (normalmente el teclado y la pantalla, respectivamente) se definen mediante dos objetos que puede usar el programador sin tener que crear flujos específicos. La clase System tiene un miembro dato denominado in que es una instancia de la clase InputStream que representa al teclado o flujo de entrada estándar. Sin embrago, el miembro out de la clase System es un objeto de la clase PrintStream, que imprime texto en la pantalla (la salida estándar). Para leer un carácter solamente tenemos que llamar a la función read desde System.in. try{ System.in.read(); }catch (IOException ex) { } Obligatoriamente, el proceso de lectura ha de estar en un bloque try..catch. Esta porción de código es la que se ha empleado en muchas aplicaciones para detener la ejecución de una aplicación hasta que se pulse la tecla Enter. Para leer un conjunto de caracteres hasta que se pulse la tecla Enter escribimos StringBuffer str=new StringBuffer(); char c; try{ while ((c=(char)System.in.read())!='\n'){ str.append(c); } }catch(IOException ex){} La clase StringBuffer es una clase que nos permite crear strings. Contiene métodos para añadir nuevos caracteres a un buffer y convertir el resultado final en un string. Las principales funciones miembro son insert y append. Usamos una versión de esta última función para añadir un carácter al final de un objeto de la clase StringBuffer. Para convertir un objeto str de la clase StringBuffer a String se usa la función miembro toString. Esta llamada se hace de forma implícita cuando dicho objeto se le pasa a System.out.println. System.out.println(str); Finalmente, se ha de hacer notar, que la función read miembro de InputStream devuelve un int que es convertido a char. La clase Reader Para comprender la clase Reader nada como un ejemplo: package teclado; import java.io.*; public class TecladoApp2 { public static void main(String[] args) { StringBuffer str=new StringBuffer(); char c; try{ Reader entrada=new InputStreamReader(System.in); // while ((c=(char)System.in.read())!='\n'){ while ((c=(char)entrada.read())!='\n'){ str.append(c); } }catch(IOException ex){} System.out.println(str); try { //espera la pulsación de una tecla y luego RETORNO System.in.read(); }catch (Exception e) { } } } Existe la posibilidad de conectar el objeto System.in con un objeto de la clase InputStreamReader para leer los caracteres tecleados por el usuario. Esta conexión se realiza mediante la sentencia Reader entrada=new InputStreamReader(System.in); Para leer una sucesión de caracteres se emplea un código similar StringBuffer str=new StringBuffer(); char c; try{ Reader entrada=new InputStreamReader(System.in); while ((c=(char)entrada.read())!='\n'){ str.append(c); } }catch(IOException ex){} Para imprimir los caracteres leídos se escribe con: System.out.println(str); Tambien se puede usar la segunda versión de la función read para leer el conjunto de caracteres tecleados por el usuario, el programa seria: package teclado; import java.io.*; public class TecladoApp1 { public static void main(String[] args) { char[] buffer=new char[255]; System.out.println("Introduce una línea de texto y pulsa RETORNO "); try{ Reader entrada=new InputStreamReader(System.in); int numBytes=entrada.read(buffer); System.out.println("Número de bytes leídos "+numBytes); }catch(IOException ex){ System.out.println("Error entrada/salida"); } System.out.println("La línea de texto que has escrito es "); String str=new String(buffer); System.out.println(str); try { //espera la pulsación de una tecla y luego RETORNO System.in.read(); }catch (Exception e) { } } } char[] buffer=new char[255]; try{ Reader entrada=new InputStreamReader(System.in); int numBytes=entrada.read(buffer); System.out.println("Número de bytes leídos "+numBytes); }catch(IOException ex){ } En esta segunda porción de código, se lee un conjunto de caracteres hasta que se pulsa la tecla Enter, los caracteres se guardan en el array buffer. La función read devuelve el número de caracteres leídos. Para imprimir los caracteres leídos se crea un objeto str de la clase String a partir de un array de caracteres buffer, empleando uno de los constructores de dicha clase. A continuación, se imprime el string str. String str=new String(buffer); System.out.println(str); Ejercicio para el lector Realice un aplicación que lea desde entrada estándar 5 notas con números de punto flotante y calcule el promedio de estas 5 notas, este promedio debe ser impreso en pantalla. Investigue que es y como funciona la clase Scanner, Ahora que usted la conoce y sabe de su funcionamiento modificar todos los programas anteriormente realizados para que capturen la entrada de datos estándar con la clase Scanner.