execute file from defined directory with Runtime.getRuntime().exec execute file from defined directory with Runtime.getRuntime().exec shell shell

execute file from defined directory with Runtime.getRuntime().exec


It should be possible to call the executable with a specific working directory using Runtime.exec(String command, String[] envp, File dir)

as follows:

Process process2=Runtime.getRuntime().exec("/data/data/my-package/files/myfile",        null, new File("/data/data/my-package/files"));

maybe without the full path to myfile

Process process2=Runtime.getRuntime().exec("myfile",        null, new File("/data/data/my-package/files"));

Context#getFilesDir() instead of hardcoding the path should work too and is safer / cleaner than specifying the path yourself since it is not guaranteed that /data/data/..is always the correct path for all devices.

Process process2=Runtime.getRuntime().exec("myfile",        null, getFilesDir()));

The problem with cd somewhere is that the directory is changed for a different Process so the second call to exec in a new Process does not see the change.


It works for me when I use the following overloaded method:

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

For example:

File dir = new File("C:/Users/username/Desktop/Sample");String cmd = "java -jar BatchSample.jar";Process process = Runtime.getRuntime().exec(cmd, null, dir);

The command just stores the command you want to run in command line. dir just stores the path of your .jar file to be executed.


A different solution will be,

Execute a .bat file from the Java Code

And do all the directory change, and stuff inside the bat file

For instance, my execute.bat file looks like this,

cd flutter_appflutter build apkcd ..

And the Java code looks like this,

Process process = Runtime.getRuntime().exec("execute.bat");