vacio sirve saber que para metodo esta ejercicios directorio crear como clase archivo java command-line batch-file working-directory

sirve - metodo exists java



cambiando el directorio de trabajo del comando de java (3)

Necesito ejecutar un archivo .exe desde una función en uno de los paquetes que tengo en mi proyecto de Java. ahora el directorio de trabajo es el directorio raíz del proyecto para java pero el archivo .exe en los subdirectorios de mi proyecto. así es como se organiza el proyecto:

ROOT_DIR |.......->com | |......->somepackage | |.........->callerClass.java | |.......->resource |........->external.exe

Inicialmente traté de ejecutar el archivo .exe directamente a través de:

String command = "resources//external.exe -i input -o putpot"; Runtime rt = Runtime.getRuntime(); Process pr = rt.exec(command);

pero el problema es externo .exe necesita acceder a algunos archivos en su propio directorio y sigue pensando que el directorio raíz es su directorio. Incluso traté de usar el archivo .bat para resolver el problema, pero el mismo problema se plantea:

Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "resources//helper.bat"});

y el archivo .bat está en el mismo directorio que el archivo .exe pero ocurre el mismo problema. aquí está el contenido del archivo .bat:

@echo off echo starting process... external.exe -i input -o output pause

incluso si muevo el archivo .bat a la raíz y arreglo su contenido, el problema no desaparece. plz plz por favor ayuda


Para implementar esto, puede usar la clase ProcessBuilder, así es como sería:

File pathToExecutable = new File( "resources/external.exe" ); ProcessBuilder builder = new ProcessBuilder( pathToExecutable.getAbsolutePath(), "-i", "input", "-o", "output"); builder.directory( new File( "resources" ).getAbsoluteFile() ); // this is where you set the root folder for the executable to run with builder.redirectErrorStream(true); Process process = builder.start(); Scanner s = new Scanner(process.getInputStream()); StringBuilder text = new StringBuilder(); while (s.hasNextLine()) { text.append(s.nextLine()); text.append("/n"); } s.close(); int result = process.waitFor(); System.out.printf( "Process exited with result %d and output %s%n", result, text );

Es un montón de código, pero te da aún más control sobre cómo se ejecutará el proceso.


Use esta forma del método exec para especificar un directorio de trabajo

public Process exec(String[] cmdarray, String[] envp, File dir) throws IOException

El directorio de trabajo es el tercer argumento. Puede pasar null por envp si no necesita establecer ningún entorno especial.

También hay este método de conveniencia :

public Process exec(String command, String[] envp, File dir) throws IOException

... donde especificas el comando en una cadena (simplemente se convierte en una matriz para ti, mira los documentos para más detalles).


Obtuve el mismo problema en mi proyecto, probé estas soluciones sobre ProcessBuilder.directory(myDir) y el método de Runtime de Runtime y todas mis bandejas fallaron.
Me hace entender que Runtime tiene privilegios limitados solo para el directorio de trabajo y los subdirectorios del mismo.

Entonces mi solución es muy buena pero funciona muy bien.
Creo un archivo .bat temporal en "runtime" en el directorio de trabajo.
Este archivo incluye dos líneas de comandos:
1. Vaya al directorio necesario (comando cd).
2. Haz el comando en necesidad.
Llamo al ejecutivo de Runtime con mi archivo temporalmente .bat como comando.
¡Me funciona muy bien!