 |
ISIS1206 - Estructuras de Datos |
Introducción a las aplicaciones de línea de comandos en Java
Objetivos
- Conocer las clases y métodos que ofrece java para crear aplicaciones de consola
- Aprender a leer información ingresada por el usuario en la consola
- Aprender a utilizar la consola para presentar información al usuario
- Aprender a utilizar el ambiente de programación DrJava
Java y la ejecución en el entorno
De acuerdo a la documentación y filosofía de Java, el lenguaje se encuentra construido bajo la premisa "Write once, run anywhere", es decir, las instrucciones dispuestas en un archivo de código fuente pueden ser ejecutadas de forma equivalente en diversos sistemas operativos o arquitecturas de procesador.
Con el fin de abstraer estas características, Java se basa en una máquina virtual, la cual se encarga de procesar el bytecode, primero interpretándolo y luego traduciéndolo a instrucciones nativas de la máquina, de tal forma que el dispositivo huésped pueda ejecutar el programa final. Conforme a la anterior descripción, es necesario definir un compilador de java (javac
) y un entorno de ejecución de Java (Concretamente, el JRE se invoca con el comando java
, y el compilador de java usando el comando javac
).
Si se desea obtener mayor información acerca del funcionamiento de la JVM y acceder a la documentación detallada sobre el bytecode, puede revisar la descripción detallada en: http://docs.oracle.com/javase/specs/jvms/se8/html/.
Adicionalmente, si desea conocer acerca de las opciones de los comandos de compilación y ejecución de java en consola, es posible escribir java -help
, de igual manera para el comando javac
.
Ejemplo de compilación y de ejecución de un programa de Java
Por ejemplo, suponga que se desea compilar el archivo Test.java, para este fin, es necesario ejecutar en consola:
javac Test.java #Compila el archivo fuente, genera un archivo .class que contiene el bytecode
java Test #Interpreta y ejecuta el archivo .class
Actualmente, existen herramientas que permiten automatizar el proceso de compilación y ejecución de programas de Java (Especialmente si cuentan con un número considerable de dependencias y clases), por ejemplo Apache Ant. No obstante, este material se encuentra fuera de los objetivos de esta sección.
Java y las entradas estándar
Como fue posible discutir en la sección historia del terminal moderno , tras la introducción de Unix al mercado, se estableció un sistema generalizado de intercambio de información entre un programa y su entorno (Sistema Operativo), a través del uso de flujos o entradas estándar.
Actualmente, se definieron tres tipos de flujo: Un flujo de entrada (stdin), un flujo de salida (stdout), y finalmente, un flujo de diagnósticos y errores (stderr). Con el fin de interactuar directamente con el sistema operativo, la JVM define a través de la clase System, tres atributos relacionados con las flujos de información estándar. El siguiente código muestra un fragmento de esta clase:
package java.lang;
import java.io.*;
public class System{
...
public final static PrintStream out = ...; //flujo de salida
public final static InputStream in = ...; //flujo de entrada
public final static PrintStream err = ...; //flujo de diagnóstico de errores
...
}
¿Cómo leer de la consola?
Existen varias formas de leer desde la consola: utilizando un BufferedReader (la misma clase usada para leer archivos), leyendo directamente carácter por carácter o usando la clase Scanner, entre otras opciones. La recomendación en este curso es utilizar la clase Scanner de java que permite leer fácilmente desde un InputStream, que en este caso es el flujo de entrada de la consola (System.in). Esta clase ofrece funcionalidades para analizar la entrada y convertirla en tipos primitivos o strings.
Mayor información: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html
El siguiente ejemplo muestra como utilizar la clase Scanner
para leer dos enteros de la consola e imprime el resultado de su suma.Se recomienda crear una aplicación para ejecutar y probar este código.
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()){
int a = sc.nextInt();
int b = sc.nextInt();
int c = a+b;
System.out.println(c);
}
sc.close();
¿Cómo escribir en la consola?
Para imprimir en la consola solo debe invocar el método print
o println
sobre el atributo out
de la clase System
.
print
Imprime el string que llega como parámetro
println
Imprime el string que llega como parámetro y un salto de línea("\n")
System.out.println(<valor a imprimir>);
Además de los métodos print y println, la clase PrintStream
ofrece el método format
que permite imprimir un string con un formato específico. Esto es particularmente útil cuando se quieren imprimir números o una cadena de texto que debe ser compuesta utilizando múltiples variables, por ejemplo:
System.out.format("El estudiante %s"
+" se encuentra en %d semestre"
+" y su promedio es %.2f", "Pedro perez", 8, 3.9);
imprimirá en la consola
El estudiante Pedro perez se encuentra en 8 semestre y su promedio es 3,90
Para conocer más información sobre como utilizar el formato puede consultar:
Un ejemplo completo
A continuación se define un ejemplo que involucra el uso de las tres entradas:
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.Scanner;
public class HelloStudent
{
public static void main(String... args)
{
try
{
Scanner sc = new Scanner(System.in);
System.out.println("Ingrese su nombre completo: ");
String name = sc.nextLine();
System.out.println("Ingrese su edad: ");
int age = sc.nextInt();
System.out.format("Bienvenido a ISIS1206 %s su edad es %d años",name, age);
}
catch (Exception e)
{
System.err.println("Error:" + e.getMessage());
e.printStackTrace();
}
}
}
Nota: Ejecutar la instrucción e.printStackTrace()
tras capturar una excepción, es equivalente a escribir el Stack trace generado por el entorno de ejecución de Java en la entrada de error y diagnóstico, usando el bloque de ejecución:
try
{
...
}
catch(Exception e)
{
for(StackTraceElement ste : e.getStackTrace())
{
System.err.println(ste);
}
}