public class CmdLine {
public static void main (String[] args)
{
int i = 0;
System.out.println (args.length + " Parameters...");
for (String s: args)
{
System.out.println("Parameter " + i + " : " +s);
i++;
}
if (args.length != 1)
{
System.err.println ("Just one parameter please");
System.exit (85);
}
System.out.println ("Hello " + args[0]);
}
}Java nos proporciona los parámetros de la línea de comandos como una
matriz de objetos String que se pasa al método estático
main de la clase principal.
Java nos proporciona exclusivamente los parámetros del programa no incluyendo el nombre del programa como primer argumento. A diferencia de otros lenguajes, obtener el nombre del programa original en Java no es inmediato.
Vale, para que os hagáis una idea, la forma de obtener el nombre del programa, sería algo como esto:
String path = CmdLine.class.getProtectionDomain(). getCodeSource().getLocation().getPath(); System.out.println ("Path: " + path);El código anterior nos mostará el path completo al fichero
.jarque estamos ejecutando. Sin embnargo, si estamos ejecutando una clase Java directamente usando el intérpretejava, solo mostrará el path y no el nombre del fichero. Alternativamente el siguiente código mostrará el nombre de la clase, si bien, no está garantizado el funcione en todas las máquinas virtualesSystem.out.println ("Nombre:" + System.getProperty("sun.java.command"));
Más allá de lo que acabamos de contar, Java por si mismo no nos
permite hacer mucho más, si bien, uno de los puntos fuertes de Java es
que existen librerías para todo y podréis encontrar multitud de opciones
para esta tarea. A modo de ejemplo os mostraremos como utilizar el port
de getopt de GNU que podéis encontrar aquí
(https://www.urbanophile.com/arenn/hacking/getopt/). Lo podéis descargar
de la página oficial, pero probablemente tendréis un paquete
libgetopt-java o similar disponible en vuestra
distribución.
import gnu.getopt.Getopt;
public class CmdLine1 {
public static void main (String[] args)
{
int i = 0;
int c;
String arg, input = "entrada.txt", output="salida.txt";
Getopt g = new Getopt("cmdline", args, "hi:o:");
while ((c = g.getopt()) != -1)
{
switch(c)
{
case 'h':
System.out.print("Ayuda. Usa cmdline [-h] [-i f] [-o f]\n");
break;
//
case 'i':
case 'o':
arg = g.getOptarg();
if (c == 'i' & arg != null) input = arg;
if (c == 'o' & arg != null) output = arg;
break;
//
case '?':
break; // getopt() muestra su propio error.
//
default:
System.out.print("Comado desconocido " + c + "\n");
}
}
System.out.println ("Copiando "+ input +" a " + output);
}
}El funcionamiento es idéntico al del lenguaje C. La cadena que
pasamos al objeto Getopt define las posibles opciones. En
este caso las opciones son h, i y
o, aceptando las dos últimas un parámetro, algo que se
indica con el caracter :, siguiendo el formato estándar de
la función getopt de la librería estándar C.
Si pasamos una opción no definida, el método getopt
devolverá el caracter ? y mostrará un error.
Para poder compilar el programa de ejemplo y ejecutarlo tenéis varias opciones, pero la más sencilla es utilizar la variables
CLASSPATH.$ export CLASSPATH=.:/usr/share/java/gnu-getopt.jar
Podéis consultar la página oficial del paquete para explorar todas las opciones que ofrece, las cuales, para este paquete en concreto, replican las disponibles en la librería C del mismo nombre.
El paquete define una clase LongOpt con la que trabajar
con opciones largas (de la forma --opcion).
Resumen
- Java recive las opciones pasados en la línea de comandos como el
primer parámetro de la función
main - Las opciones se reciben como una matriz de
Strings. - No es posible averiguar el nombre del programa ni modificarlo
utilizando el parámetro recibido en
main - El paquete
gnu-getoptimplementa la misma funcionalidad que la funcióngetoptylongoptde C.
■
