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.