Toda aplicación requiere información de entrada para realizar las operaciones que cada proceso resuelve, así como requiere mecanismos de salida para entregar los resultados.
La forma de representar estas entradas y salidas en Java es con base en “streams” que son flujos de datos. Un “stream” se comporta como un medio de comunicación entre el programa y la fuente o destino de los datos. La información se transporta en serie a través de este medio
Clase System
En Java, la entrada desde teclado y la salida a pantalla se utilizan a través de la clase System. Esta clase pertenece al paquete java.lang y posee atributos y métodos que se relacionan directamente con el sistema local.
Tipo | Atributo | Descripción |
static InputStream | in | Objeto preparado para recibir datos desde la entrada estándar del sistema que generalmente es el teclado |
static PrintStream | out | Objeto preparado para imprimir los datos en la salida estándar del sistema que generalmente es la pantalla |
static PrintStream | err | Objeto utilizado para mensajes de error presentados por defecto en pantalla. |
Clase InputStream
La clase InputStream, es necesaria para realizar la lectura de información por entrada estándar. Esta clase pertenece al paquete java.io.
Retorno | Método | Descripción |
int | available() | Retorna el número estimado de bytes que pueden ser leídos por el InputStream Constructor que inicializa el BigInteger con el valor de la cadena de caracteres del parámetro. |
abstract int | read() | Lee el siguiente byte de datos del InputStream. |
int | read(byte[] b) | Lee un número de bytes desde el InputStream y lo almacena en el parámetro. |
int | read(byte[] b, int off, int len) | Lee hasta la longitud dada por el parámetro len desde el InputStream y lo almacena en el parámetro b. |
long | skip(long n) | Salta y descarta n bytes de datos del InputStream |
Ejemplo de uso del método read
Para leer desde teclado se puede utilizar el método read de la clase InputStream. Este método lee un carácter por cada llamada. Su valor de retorno es un int que corresponde al código ASCII del carácter capturado. Si se espera cualquier otro tipo hay que hacer una conversión explícita mediante un “cast”. Así mismo, este método requiere realizar el manejo de excepción de la clase IOException.
import java.io.IOException; public class EjemplosSystem { public static void main(String[] args) { char c; try { c=(char)System.in.read(); } catch (IOException e) { e.printStackTrace(); } } }
Para leer cadenas de datos es necesario emplear una estructura de repetición while o for y unir los caracteres.
import java.io.IOException; public class EjemplosSystem { public static void main(String[] args) { char c; String cadena=""; try { while((c=(char)System.in.read()) != '\n') cadena = cadena + c; } catch (IOException e) { e.printStackTrace(); } } } }
Clase PrintStream
La clase PrintStream, es necesaria para realizar la escritura de información por salida estándar. Esta clase pertenece al paquete java.io
Retorno | Método | Descripción |
PrintStream | append(char c) | Agrega el carácter del parámetro al PrintStream |
void | close() | Cierra el PrintStream |
void | print(String s) | Imprime la cadena del parámetro |
void | println() | Imprime un salto de línea |
void | println(String x) | Imprime la cadena del parámetro más un salto de línea |
void | write(int b) | Escribe el byte especificado del parámetro en el PrintStream |
Para escribir cadenas de datos en salida estándar se requiere usar el objeto System.out.
System.out.println("Hola mundo");
Class BufferedReader
La clase BufferedReader, proporciona métodos para la captura de información en cadenas de caracteres, optimizando el proceso que se debería realizar a través del objeto “in” de la clase System. Esta clase pertenece al paquete java.io
Retorno | Método | Descripción |
void | BufferedReader(Reader in) | Constructor que crea un buffer de entrada de datos a través del parámetro |
void | close() | Cierra el Stream |
int | read() | Lee un carácter y retorna el valor entero del carácter equivalente al código ASCII |
String | readLine() | Lee una cadena de caracteres |
Ejemplo de uso del método readLine
Una de las formas más simples de utilizar el BufferedReader, con entrada estándar, es a través de una estructura de repetición while para leer indefinidamente hasta no encontrar más información.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class EjemplosSystem { public static void main(String[] args) { String cadena=""; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { while((cadena=br.readLine())!=null){ //Codigo que usa el objeto cadena } } catch (IOException e) { e.printStackTrace(); } } }
Si se requiere capturar datos numéricos, es necesario realizar un “cast” y debe controlarse la correspondiente excepción.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class EjemplosSystem { public static void main(String[] args) { String cadena=""; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int dato; try { while((cadena=br.readLine())!=null){ dato=Integer.parseInt(cadena); dato+=1; System.out.println(dato); } } catch (IOException e) { e.printStackTrace(); } } }
10 20 30 40 50 Hola mundo
11 21 31 41 51 Exception in thread "main" java.lang.NumberFormatException: For input string: "Hola mundo" at java.lang.NumberFormatException.forInputString(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at EjemplosSystem.main(EjemplosSystem.java:16)
En el caso anterior queda evidencia del uso de la excepción, debido a que el texto “Hola mundo”, no se puede convertir a numero, se produce la excepción controlada por la clase java.lang.NumberFormatException.
Clase Scanner
La clase Scanner, proporciona métodos para la captura de información en diferentes tipos de datos. Esta clase pertenece al paquete java.io
Retorno | Método | Descripción |
void | Scanner(File source) | Constructor que crea un Scanner que produce valores capturados desde un archivo especificado por el parámetro. |
void | Scanner(InputStream source) | Constructor que crea un Scanner que produce valores capturados desde un InputStream especificado por el parámetro. |
void | close() | Cierra el Scanner |
boolean | hasNext() | Retorna verdadero si el Scanner posee otro token en la entrada |
boolean | hasNextBigInteger() | Retorna verdadero si el Scanner posee otro token en la entrada que puede ser interpretado como BigInteger |
boolean | hasNextBoolean() | Retorna verdadero si el Scanner posee otro token en la entrada que puede ser interpretado como booleano mediante las cadenas true o false |
boolean | hasNextDouble() | Retorna verdadero si el Scanner posee otro token en la entrada que puede ser interpretado como double |
boolean | hasNextFloat() | Retorna verdadero si el Scanner posee otro token en la entrada que puede ser interpretado como float |
boolean | hasNextInt() | Retorna verdadero si el Scanner posee otro token en la entrada que puede ser interpretado como int |
boolean | hasNextLine() | Retorna verdadero si el Scanner posee una nueva cadena de caracteres. |
boolean | hasNextLong() | Retorna verdadero si el Scanner posee otro token en la entrada que puede ser interpretado como long |
boolean | hasNextShort() | Retorna verdadero si el Scanner posee otro token en la entrada que puede ser interpretado como short |
String | next() | Retorna el siguiente token como cadena de caracteres |
BigInteger | nextBigInteger() | Retorna el siguiente token como BigInteger |
boolean | nextBoolean() | Retorna el siguiente token como boolean |
double | nextdouble() | Retorna el siguiente token como double |
float | nextFloat() | Retorna el siguiente token como float |
int | nextInt() | Retorna el siguiente token como int |
String | nextLine() | Retorna la siguiente línea como cadena de caracteres |
long | nextLong() | Retorna el siguiente token como long |
short | nextShort() | Retorna el siguiente token como short |
Ejemplo de uso de los métodos hasNext, hasNextInt, next y nextInt
Conociendo los datos de entrada, es de bastante utilidad la clase Scanner, debido a que esta no requiere realizar “cast” en caso en que los datos sean diferentes de String. Por otro lado, es sencillo controlar el tipo de dato del siguiente token evitando presencia de excepciones.
import java.util.Scanner; public class EjemplosSystem { public static void main(String[] args) { Scanner s = new Scanner(System.in); int dato; while(s.hasNext()){ if(s.hasNextInt()){ dato=s.nextInt(); dato+=1; System.out.println(dato); }else{ System.out.println(s.next()); } } } }
10 20 30 40 50 Hola mundo
11 21 31 41 51 Hola mundo
No hay comentarios:
Publicar un comentario