этот код использует команду «где» в Windows и «какую» в других системах, чтобы проверить, знает ли система о нужной программе в PATH. Если найдено, функция возвращает java.nio.file.Path в программу, и в противном случае возвращает ноль.
Я тестировал его с Java 8 на Windows 7 и Linux Mint 17.3.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.logging.Logger;
public class SimulationUtils
{
private final static Logger LOGGER = Logger.getLogger(SimulationUtils.class.getName());
public static Path lookForProgramInPath(String desiredProgram) {
ProcessBuilder pb = new ProcessBuilder(isWindows() ? "where" : "which", desiredProgram);
Path foundProgram = null;
try {
Process proc = pb.start();
int errCode = proc.waitFor();
if (errCode == 0) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()))) {
foundProgram = Paths.get(reader.readLine());
}
LOGGER.info(desiredProgram + " has been found at : " + foundProgram);
} else {
LOGGER.warning(desiredProgram + " not in PATH");
}
} catch (IOException | InterruptedException ex) {
LOGGER.warning("Something went wrong while searching for " + desiredProgram);
}
return foundProgram;
}
private static boolean isWindows() {
return System.getProperty("os.name").toLowerCase().contains("windows");
}
}
Чтобы использовать это:
System.out.println(SimulationUtils.lookForProgramInPath("notepad"));
В моей системе Windows 7 отображается:
C: \ Windows \ System32 \ notepad.exe
И в Linux:
System.out.println(SimulationUtils.lookForProgramInPath("psql"));
/ USR / бен / PSQL
Преимущество этого метода в том, что он должен работать на любой платформе, и нет необходимости анализировать переменную среды PATH или просматривать реестр. Желаемая программа никогда не вызывается, даже если найдена. Наконец, нет необходимости знать расширение программы. gnuplot.exe под Windows и gnuplot под Linux будут найдены одним кодом:
SimulationUtils.lookForProgramInPath("gnuplot")
Предложения по улучшению приветствуются!