martes, 13 de diciembre de 2011

Entrada y salida estandar

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.

TipoAtributoDescripción
static InputStreaminObjeto preparado para recibir datos desde la entrada estándar del sistema que generalmente es el teclado
static PrintStreamoutObjeto preparado para imprimir los datos en la salida estándar del sistema que generalmente es la pantalla
static PrintStreamerrObjeto 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.

RetornoMétodoDescripción
intavailable()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  intread()Lee el siguiente byte de datos del InputStream.
intread(byte[] b)Lee un número de bytes desde el InputStream y lo almacena en el parámetro.
intread(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.
longskip(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

RetornoMétodoDescripción
PrintStreamappend(char c)Agrega el carácter del parámetro al PrintStream
voidclose()Cierra el PrintStream
voidprint(String s)Imprime la cadena del parámetro
voidprintln()Imprime un salto de línea
voidprintln(String x)Imprime la cadena del parámetro más un salto de línea
voidwrite(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

RetornoMétodoDescripción
voidBufferedReader(Reader in)Constructor que crea un buffer de entrada de datos a través del parámetro
voidclose()Cierra el Stream
intread()Lee un carácter y retorna el valor entero del carácter equivalente al código ASCII
StringreadLine()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();
  }
 }
}
Entrada Estándar
10
20
30
40
50
Hola mundo
Salida Estándar
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

RetornoMétodoDescripción
voidScanner(File source)Constructor que crea un Scanner que produce valores capturados desde un archivo especificado por el parámetro.
voidScanner(InputStream source)Constructor que crea un Scanner que produce valores capturados desde un InputStream especificado por el parámetro.
voidclose()Cierra el Scanner
booleanhasNext()Retorna verdadero si el Scanner posee otro token en la entrada
booleanhasNextBigInteger()Retorna verdadero si el Scanner posee otro token en la entrada que puede ser interpretado como BigInteger
booleanhasNextBoolean()Retorna verdadero si el Scanner posee otro token en la entrada que puede ser interpretado como booleano mediante las cadenas true o false
booleanhasNextDouble()Retorna verdadero si el Scanner posee otro token en la entrada que puede ser interpretado como double
booleanhasNextFloat()Retorna verdadero si el Scanner posee otro token en la entrada que puede ser interpretado como float
booleanhasNextInt()Retorna verdadero si el Scanner posee otro token en la entrada que puede ser interpretado como int
booleanhasNextLine()Retorna verdadero si el Scanner posee una nueva cadena de caracteres.
booleanhasNextLong()Retorna verdadero si el Scanner posee otro token en la entrada que puede ser interpretado como long
booleanhasNextShort()Retorna verdadero si el Scanner posee otro token en la entrada que puede ser interpretado como short
Stringnext()Retorna el siguiente token como cadena de caracteres
BigIntegernextBigInteger()Retorna el siguiente token como BigInteger
booleannextBoolean()Retorna el siguiente token como boolean
doublenextdouble()Retorna el siguiente token como double
floatnextFloat()Retorna el siguiente token como float
intnextInt()Retorna el siguiente token como int
StringnextLine()Retorna la siguiente línea como cadena de caracteres
longnextLong()Retorna el siguiente token como long
shortnextShort()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());
   }
  }
 }
}
Entrada Estándar
10
20
30
40
50
Hola mundo
Salida Estándar
11
21
31
41
51
Hola mundo

No hay comentarios:

Publicar un comentario