我需要从java项目中一个软件包中的一个函数中执行一个.exe文件。现在,工作目录是Java项目的根目录,但.exe文件位于项目的子目录中。这是项目的组织方式:
ROOT_DIR |.......->com | |......->somepackage | |.........->callerClass.java | |.......->resource |........->external.exe
最初,我尝试直接通过以下方式运行.exe文件:
String command = "resources\\external.exe -i input -o putpot"; Runtime rt = Runtime.getRuntime(); Process pr = rt.exec(command);
但是问题是外部.exe需要访问其自己目录中的某些文件,并一直认为根目录是其目录。我什至尝试使用.bat文件来解决问题,但是出现了同样的问题:
Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "resources\\helper.bat"});
.bat文件与.exe文件位于同一目录中,但是会发生相同的问题。这是.bat文件的内容:
@echo off echo starting process... external.exe -i input -o output pause
即使将.bat文件移至根目录并修复其内容,问题也不会消失。请帮助
要实现此目的,您可以使用ProcessBuilder类,如下所示:
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 );
这是一堆代码,但是可以让您进一步控制流程的运行方式。