Parámetros Línea de Comandos. Java
SOLUCIONARIO
Parámetros Línea de Comandos. Java
2025-11-09
Por
Occam's Razor

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.

SOY CURIOSO

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 .jar que estamos ejecutando. Sin embnargo, si estamos ejecutando una clase Java directamente usando el intérprete java, 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 virtuales

    System.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.

SOY NOVATO

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-getopt implementa la misma funcionalidad que la función getopt y longopt de C.

SOBRE Occam's Razor
Somos una revista libre que intenta explicar de forma sencilla conceptos tecnológicos y científicos de los que no podemos escapar. Al final, todo es más fácil de lo que parece!

 
Tu publicidad aquí :)