
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
Y este el de multiples accesos:
El asunto es que en NetBeans si que funciona pero cuando lo ejecuto por consola con estos parametros:
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?
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


0