Среда выполнения команд Java.getRuntime ().exec () в Mac OS
Im использует Mac OS Lion, с java версии 1.6.0_26
Я делаю небольшое приложение для Mac на Java с главным меню для пользователя, чтобы он мог выбрать несколько вариантов.Один из них-установить приложение с помощью a .pkg
С этими командами все работало нормально:
File instFolder = new File(System.getProperty("user.dir") + "/foldername/appInstaller.pkg");
String s = "open "+ instFolder.toString();
Process p = Runtime.getRuntime().exec(s);
Затем я понял, что есть проблема, когда foldername имеет пробелы или если я копирую этот файл java с нужными подпапками на USB-накопитель с "NO NAME" в качестве имени (или какое-то имя с пространства).
Потому что s станет чем-то вроде:
open /Volumes/NO NAME/foldername/appInstaller.pkg
или
откройте /Users / user1 / Desktop / folder name / appInstaller.pkg
Поэтому, когда вы запускаете процесс p, команда завершится там, где на пути появится первый пробел
open / Volumes / NO
или
открыть /пользователи / user1 / рабочий стол / папка
Чтобы попытаться исправить это, я изменил определение s на что-то вроде это:
String s = "open "+ """ + instFolder.toString() + """;
Он перестал нормально работать. Самое странное, что если я скопирую значение s (после создания переменной s) и вставлю его в терминал, это сработает:
откройте " / Users / user1 / Desktop / folder name/appInstaller.pkg"
но запуск его с Java не работает.
Спасибо.
3 ответа:
Чтобы правильно экранировать аргументы, можно использовать следующее:
Runtime.getRuntime().exec(new String[] { "open", instFolder.toString() });
Хотя я бы, вероятно, использовал более современный ProcessBuilder :
ProcessBuilder pb = new ProcessBuilder("open", instFolder.toString()); Process p = pb.start(); int exitCode = p.waitFor();
Хотя это может быть стоит прочитать в зависимости от того, что вы хотите сделать с выводом процессов.
Примечание: отредактировано для отражения вопроса в комментарии