Java - Fallo al ejecutarlo en línea de comandos

 
Vista:
sin imagen de perfil

Fallo al ejecutarlo en línea de comandos

Publicado por Victor (18 intervenciones) el 03/11/2021 10:49:39
Buenos dias.
Tengo un ejemplo de creacion de procesos y acceso multiple con sicronizacion que funciona bien en netBeans pero me falla cuando lo ejecuto por consola,en teoria el ejemplo está bien.
Este es el codigo de creacion de multiples procesos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package crearmultiplesaccesos;
 
import java.io.File;
import java.io.RandomAccessFile;
import java.io.PrintStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
/**
 *
 * @author usuario
 */
public class Main {
 
    /**
     * @param args argumentos de la línea de comandos
     * Puede no recibir ningún argumento. En el caso de que
     * reciba alguno, será uno, y será la ruta del archivo a
     * utilizar en los accesos
     */
    public static void main(String[] args) {
        Process nuevoProceso; //Definimos una variable de tipo Process
        String nombreFichero;
        File archivo = null;
        RandomAccessFile raf = null;
 
         //Identificamos el sistema operativo para poder acceder por su ruta al
      //fichero de forma correcta.
      String osName = System.getProperty("os.name");
      if (osName.toUpperCase().contains("WIN")){ //Windows
        if (args.length > 0)
            nombreFichero = args[0].replace("\\", "\\\\");
            //Hemos recibido la ruta del fichero en la línea de comandos
        else{
            nombreFichero = "C:\\Users\\Victor\\Documents\\NetBeansProjects\\carpetaConJar\\valor.txt";
            //Fichero que se utilizará por defecto
          }
      }else{ //GNU/Linux
          if (args.length > 0)
            nombreFichero = args[0];
          //Hemos recibido la ruta del fichero en la línea de comandos
          else{
               nombreFichero = "/home/margye/valor.txt";
               //Fichero que se utilizará por defecto
        }
      }
        try{
            //Redirigimos salida estándar y de error a un fichero
            PrintStream ps = new PrintStream(
                             new BufferedOutputStream(new FileOutputStream(
                             new File("C:\\Users\\Victor\\Documents\\NetBeansProjects\\carpetaConJar\\javalog.txt"),true)), true);
            System.setOut(ps);
            System.setErr(ps);
        }catch(Exception e){
            System.err.println("Error al redirigir las salidas");
            System.err.println(e.toString());
        }
 
      archivo = new File(nombreFichero);
      //Preparamos el acceso al fichero
      if (!archivo.exists()){
        //Si no existe el fichero
        try {
            archivo.createNewFile(); //Lo creamos
            raf = new RandomAccessFile(archivo,"rw"); //Abrimos el fichero
            //El modo tiene que ser lectura-escritura. No es posible sólo escritura
            raf.writeInt(0); //Escribimos el valor inicial 0
            System.out.println("Creado el fichero.");
        }catch(Exception e){
            System.err.println("Error al crear el fichero");
            System.err.println(e.toString());
        }finally{
            try{ // Nos asegurarnos que se cierra el fichero.
                if (null != raf)
                    raf.close();
               } catch (Exception e2) {
                    System.err.println("Error al cerrar el fichero");
                    System.err.println(e2.toString());
                    System.exit(1); //Si hay error, finalizamos
               }
        }
       }
       //Creamos un grupo de procesos que accederán al mismo fichero
       try{
            for (int i = 0; i <=25; i++){
                nuevoProceso = Runtime.getRuntime().exec("java -jar "+
                    "AccesoMultipleFichero.jar " + i + " "+ args[0]);
                //Creamos el nuevo proceso y le indicamos el número de orden y
                //el fichero que debe utilizar.
                System.out.println("Creado el proceso " + i);
                //Mostramos en consola que hemos creado otro proceso
            }
        }catch (SecurityException ex){
            System.err.println("Ha ocurrido un error de Seguridad."+
                    "No se ha podido crear el proceso por falta de permisos.");
        }catch (Exception ex){
            System.err.println("Ha ocurrido un error, descripción: "+
                    ex.toString());
        }
    }
 
}

Y este el de multiples accesos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package accesomultiplefichero;
 
import java.io.File;
import java.io.RandomAccessFile;
import java.io.PrintStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileLock;
 
/**
 *
 * @author usuario
 */
public class Main {
 
    /**
     * @param args Argumentos de la línea de comando
     * El primer argumento pasado, será el número de orden de creación del proceso
     * El segundo argumento, será la ruta del fichero
     */
    public static void main(String[] args) {
      int orden = 0;
      String nombreFichero = "";
      File archivo = null;
      RandomAccessFile raf = null;
      FileLock bloqueo = null;
      int valor = 0;
      //Comprobamos si estamos recibiendo argumentos en la línea de comandos
      if (args.length > 0){
        orden = Integer.parseInt(args[0]);
        //Número de orden de creación de este proceso
        try{
            //Rediregimos salida y error estándar a un fichero
            PrintStream ps = new PrintStream(
                             new BufferedOutputStream(new FileOutputStream(
                             new File("C:\\Users\\Victor\\Documents\\NetBeansProjects\\carpetaConJar\\javalog.txt"),true)), true);
            System.setOut(ps);
            System.setErr(ps);
        }catch(Exception e){
            System.err.println("P"+orden+" No he podido redirigir salidas.");
        }
      }
      //Identificamos el sistema operativo para poder acceder por su ruta al
      //fichero de forma correcta.
      String osName = System.getProperty("os.name");
      if (osName.toUpperCase().contains("WIN")){ //Windows
        if (args.length > 1)
            nombreFichero = args[1].replace("\\", "\\\\");
            //Hemos recibido la ruta del fichero en la línea de comandos
        else{
            nombreFichero = "C:\\Users\\Victor\\Documents\\NetBeansProjects\\carpetaConJar\\valor.txt";
            //Fichero que se utilizará por defecto
          }
      }else{ //GNU/Linux
          if (args.length > 1)
            nombreFichero = args[1];
          //Hemos recibido la ruta del fichero en la línea de comandos
          else{
               nombreFichero = "/home/margye/valor.txt";
               //Fichero que se utilizará por defecto
        }
      }
      //Preparamos el acceso al fichero
      archivo = new File(nombreFichero);
      for (int i=0; i<100; i++)//aumentamos las situaciones de concurrencia
         try{
            raf = new RandomAccessFile(archivo,"rwd"); //Abrimos el fichero
            //***************
            //Sección crítica
            bloqueo = raf.getChannel().lock();
            //bloqueamos el canal de acceso al fichero. Obtenemos el objeto que
            //representa el bloqueo para después poder liberarlo
            System.out.println("Proceso"+ orden +
                  ": ENTRA sección");
            // Lectura del fichero
            valor = raf.readInt(); //leemos el valor
            valor ++; //incrementamos
            raf.seek(0); //volvemos a colocarnos al principio del fichero
            raf.writeInt(valor); //escribimos el valor
            System.out.println("Proceso"+ orden +
                   ": SALE sección");
            bloqueo.release(); //Liberamos el bloqueo del canal del fichero
            bloqueo = null;
            //Fin sección crítica
            //*******************
            System.out.println("Proceso"+ orden +
                 ": valor escrito " + valor);
        }catch(Exception e){
            System.err.println("P"+orden+" Error al acceder al fichero");
            System.err.println(e.toString());
        }finally{
            try{
                if( null != raf ) raf.close();
                if( null != bloqueo) bloqueo.release();
            }catch (Exception e2){
                System.err.println("P"+orden+" Error al cerrar el fichero");
                System.err.println(e2.toString());
                System.exit(1);  //Si hay error, finalizamos
            }
        }
 
    }
 
}

El asunto es que en NetBeans si que funciona pero cuando lo ejecuto por consola con estos parametros:
1
2
3
4
5
6
7
C:\Users\Victor>java -jar C:\Users\Victor\Documents\NetBeansProjects\carpetaConJ
ar\CrearMultiplesAccesos.jar C:\Users\Victor\Documents\NetBeansProjects\carpetaC
onJar\valor.txt
 
C:\Users\Victor>java -jar C:\Users\Victor\Documents\NetBeansProjects\carpetaConJ
ar\AccesoMultipleFichero.jar C:\Users\Victor\Documents\NetBeansProjects\carpetaC
onJar\valor.txt

Me suelta este fallo:
Exception in thread "main" java.lang.NumberFormatException: For input string: "C
:\Users\Victor\Documents\NetBeansProjects\carpetaConJar\valor.txt"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at accesomultiplefichero.Main.main(Main.java:35)


Alguna idea?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Fallo al ejecutarlo en línea de comandos

Publicado por Kabuto (1381 intervenciones) el 03/11/2021 11:26:26
Pues no debería funcionarte tampoco en NetBeans

En estas líneas, estás intentando transformar en Integer, el argumento recibido por línea de comandos, que es la ruta al archivo .txt

1
2
3
//Comprobamos si estamos recibiendo argumentos en la línea de comandos
      if (args.length > 0){
        orden = Integer.parseInt(args[0]);

Lo cuál es imposible y por eso te lanza un NumberFormatException
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Fallo al ejecutarlo en línea de comandos

Publicado por Tom (1831 intervenciones) el 03/11/2021 11:30:44
Sí, que cuando lo ejecutas desde la línea de comandos no le estás pasando el primer parámetro que el programa espera (un valor numérico).
Probablemente te funciona en netbeans porque tienes asignados los parámetros en las propìedades ("Run") del proyecto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Fallo al ejecutarlo en línea de comandos

Publicado por Victor (18 intervenciones) el 03/11/2021 12:13:35
Gracias por la aclaración.
Tomo nota
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar