Entradas y Salidas en Java – Lo básico



Hola y buen día a todos mis lectores, hoy, me dieron ganas de escribirles sobre algo que es muy importante para nosotros los programadores: Las entradas y salidas, como he dicho antes, esto es algo a lo que muchos “le temen” y más aún si han migrado de Visual Basic a Java, pero realmente es algo muy extensible y fácil de usar una vez que aprendemos, aquí les tengo una pequeña cita que me gustaría compartir…

Entradas y salidas (E/S en español, I/O en inglés, para abreviar)  son fundamentales para cualquier sistema operativo o lenguaje de programación. Sólo los teoristas encuentran interesante escribir programas que no requieran entrada o produzcan salida. Al mismo tiempo, I/O – E/S (Lo llamaré I/O de ahora en adelante) difícilmente califica como uno de los temas más emocionantes en la ciencia de la computación. Es algo en el fondo, algo que usas cada día—pero para muchos desarrolladores, no es un tema con mucho “sex appeal”.
Elliote Rusty Harold.




Me gustaría extenderme sobre todo lo relacionado con I/O, comenzar desde InputStream y OutputStream (lo cubriré en otro tema), pero, ¿quién usa un FileInputStream cuando se tiene un FileReader (ver ejemplo de uso), o igual quién usa un FileOutputStream cuando se tiene un FileWriter (ver ejemplo de uso)?, por lo tanto, lo que voy a hacer es saltarme las “partes aburridas” (InputStream y OutputStream que nadie usa) y pasar a las excepciones, la consola, etc. Aquí les va:

Excepciones al utilizar I/O
Todos sabemos que al escribir código en Java tenemos que tratar muchas veces con las excepciones, ya sea que dividamos entre 0 (Lanza una excepción del tipo ArithmeticException), que tratemos de llamar a una posición en un arreglo que es mayor a su tamaño (ArrayIndexOutOfBoundsException), etc, etc. En este tema de las entradas y salidas, esto no cambia, cada que realizamos alguna operación que tome entrada o dé salida, tendrás que tratar una excepción del tipo IOException y puedes hacer esto de dos formas:


  1. Que declares throws IOException en el método donde realizas entradas o salidas.
  2. Que encierres la operación en un bloque try/catch.

La primera opción es mejor si quieres que quién llame el método tenga más control sobre qué hacer si algo sale mal (que se genere la excepción), la segunda es mejor si quieres que el bloque try/catch se haga cargo de todo, por ejemplo, que muestre un mensaje de error con un dialogo y que llame al método printStackTrace (seguimiento de la pila), es importante saber que no hay ninguna diferencia entre tratar una excepción de este tipo que en la que se trataría cualquier otra excepción.

Tratando con la consola
Primero que nada daré una pequeña definición de la consola: Llamamos consola (incorrectamente por cierto, pero la llamaré así por costumbre y comodidad del lector) a ese lugar donde normalmente vemos los mensajes que ponemos ya sea en System.out.print (o println), System.err.print (o println también) o de donde normalmente obtenemos la entrada de System.in. La veremos en distintas formas dependiendo del entorno de desarrollo o sistema operativo que usemos, por ejemplo si estás utilizando Eclipse, verás la consola en una pestaña normalmente en la parte inferior de la ventana de tu IDE (Integrated Development Environment, Entorno de Desarrollo Integrado en español),  si usas Windows como sistema operativo, puede que veas la consola en una ventana de línea de comandos, igual es para Mac y Unix.

¿La consola como GUI?
La mayoría de nosotros (Incluido yo) utilizamos la consola al inicio de nuestro aprendizaje del lenguaje para ver lo que hacía nuestro código o simplemente comprobar al final que hacíamos bien las cosas, yo en lo personal aún la uso cuando no sé si mi error está en la interfaz (GUI) o en otra parte del código, también para probar código para el cual aún no tengo una GUI, para mí es un método muy útil para diagnosticar cual método o instrucción falla, pero algo muy importante que debemos recordar, es que ¡La consola no es una buena GUI! En estos tiempos, yo no veo casi ninguna razón (por no decir que ya no la hay en lo absoluto) para pensar en utilizar la consola como interfaz de usuario, por mínima que sea la interfaz, una cosa es usar la consola en tiempo de desarrollo para tratar de darte cuenta donde te equivocaste, y otra muy distinta es que tus programas ya dirigidos al usuario la utilicen. Algunos quizá piensen ¿No se debe usar la consola solo por cuestión de estética? Pues no es así, la consola, además de ser una interfaz de usuario muy fea y poco versátil, tiene aún más desventajas, por ejemplo:
  • Puede confundir al usuario (incluso hacerle pensar que el programa no funciona bien).
  • No puedes mostrar botones, combos, cajas de texto, etc.
  • No es nada fácil  de usar para el usuario final.
  • En sistemas operativos como Mac y en algunos navegadores, la consola no admite entradas (System.in), sólo salidas (System.out y System.err).

Conociendo System.out a fondo
La mayoría llegamos a utilizar System.out incluso antes de saber lo que es una clase o un OutputStream. Específicamente, System.out es el campo estático de la clase java.lang.System. Es una instancia de java.io.PrintStream, que es una subclase de java.io.OutputStream.

System.out corresponde a stdout en Unix o C. Normalmente, la salida enviada a System.out aparece en la consola. Como regla general, la consola convierte los datos numéricos byte que envía System.out en texto ASCII o ISO Latin-1. Por lo tanto, el siguiente código escribe la cadena “Hello World!” en la consola:
Conociendo System.err a fondo


Los programadores de Unix y C reconocen stderr, que es comúnmente usado para mensajes de error. stderr es un puntero de archivo separado de stdout, pero muchas veces significa lo mismo. Generalmente tanto stderr como stdout envían datos a la consola, cualesquiera que estos sean. De todas formas, stdout y stderr pueden ser redireccionados a diferentes lugares. Por ejemplo, la salida puede ser redireccionada a un archivo mientras los mensajes de error aún aparecen en la consola.

System.err es la versión de Java de stderr. Como System.out, System.err es una instancia de java.io.Printstream, una subclase de java.io.OutputStream. System.err es comúnmente más usado dentro de la clausula catch de un bloque try/catch así:

Conociendo System.in a fondo

Sytem.in es el flujo de entrada conectado a la consola, tanto como System.out es el flujo de salida conectado a la consola. En términos Unix o C, System.in es el campo estático de la clase java.lang.System. Es una instancia de java.io.InputStream, al menos hasta donde está documentado.

Pasado lo que está documentado, System.in es en realidad un java.io.BufferedInputStream. BufferedInputStream no declara métodos nuevos, solo reescribe los que ya están declarados en java.io.InputStream. BufferedInputStream lee los datos en grandes pedazos en dentro de un búfer, entonces reparte los datos en los tamaños pedidos. Esto puede ser más eficiente que leer un carácter a la vez. De tal manera que, es completamente transparente para el programador.

La razón principal de esto es que cada byte no se presentado para ser leído mientras el usuario lo escribe en System.in. En su lugar, la entrada entra en el programa de una línea a la vez. Esto permite al usuario escribir en la consola la tecla de retroceso para corregir errores. Java no te permite poner la consola en un “modo sin procesar”, donde cada carácter se vuelve disponible tan pronto como es escrito, incluyendo caracteres como backspace (retroceso) y delete (borrar).

Bien, eso es todo por hoy, no olviden que pueden suscribirse a mis entradas por medio de su correo (en la parte superior derecha), RSS o Atom (en la parte inferior derecha), y pues ya saben, dudas, comentarios, criticas (constructivas) o peticiones son bien recibidas en la parte de abajo, saludos :D.


Entradas Relacionadas:
Escribir un archivo de texto en Java
Leer un archivo de texto en Java


Comentarios

  1. Casinos Near Hollywood Casino & Racetrack - Mapyro
    Discover 오산 출장마사지 the casinos and other gaming 전라남도 출장샵 places 군포 출장샵 to stay closest to Hollywood 밀양 출장안마 Casino & Racetrack in 제천 출장마사지 Hollywood, IL. Mapyro users can make the most of

    ResponderEliminar

Publicar un comentario