Как открыть приложение с пробелами в имени с помощью Runtime.getRuntime().exec()?

Итак, я пытаюсь сделать универсальное приложение, и я пытаюсь сделать так, чтобы оно могло открывать приложения. Итак, я решил заставить его открывать приложение, если это одно слово, но с пробелами это никогда не работает. Вот как я это делаю:

    if(textField.getText().startsWith("application open")){
    try {
        String string1 = textField.getText().substring(17, textField.getText().length());
        Runtime.getRuntime().exec("open /Applications/\"" + string1 + "\".app");
        textArea.append("Opening application " + string1 + "..." + newline);
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
    }

Если бы кто-нибудь мог мне помочь, это было бы здорово! Заранее спасибо, Говард Старк


person Howard Stark    schedule 11.10.2012    source источник
comment
Тесно связан с stackoverflow.com/questions/7134486 /   -  person Raedwald    schedule 07.01.2015


Ответы (5)


Используйте версию exec, который принимает String[]:

Это работает для меня:

String cmds[] = { "open", "/Applications/Font Book.app" };
Runtime.getRuntime().exec(cmds);

В то время как это не так:

Runtime.getRuntime().exec("open /Applications/Font Book.app");

Последний может использовать пробелы только для разделения аргументов команды, поэтому анализируется как команда open, за которой следуют 2 аргумента, разделенных пробелом. В первой — версии exec, принимающей String[] — каждый аргумент передается отдельно, поэтому у нее нет этой проблемы.

person pb2q    schedule 11.10.2012

Используйте вариант exec, который принимает команду и аргументы отдельно. Самая прямая замена

Runtime.getRuntime().exec(new String[] {"executable with spaces"})

исполняемый (строка [])

person John Watts    schedule 11.10.2012

@ScArcher2 прав (+1).

Но это решение не кроссплатформенное. Например, вам, вероятно, придется вставлять \ перед пробелами в Unix. Лучшее решение — использовать ProcessBuilder вместо Runtime.exec(). ProcessBuilder создает переносимую командную строку и автоматически поддерживает пробелы.

person AlexR    schedule 11.10.2012
comment
По какой-то причине мой ответ не сработал. Похоже, что лучший способ использовать Runtime — это использовать String[] аргументов командной строки. - person ScArcher2; 12.10.2012

Вместо этого вы можете попробовать использовать ProcessBuilder: http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html

Используйте метод directory(File directory), чтобы установить рабочий каталог (тот, который содержит пробелы), а затем используйте start() для запуска процесса.

Упрощенный пример из javadoc:

 ProcessBuilder pb =
   new ProcessBuilder("myCommand", "myArg1", "myArg2");
 pb.directory(new File("myDir"));
 Process p = pb.start();
person uldall    schedule 11.10.2012

Используйте ProcessBuilder, это то, для чего он разработан, чтобы сделать вашу жизнь проще

ProcessBuilder pb = new ProcessBuilder("open", "/Applications/\"" + string1 + "\".app");
Process p = pb.start();

Как объясняется в этом сообщении Запуск сценария оболочки из java код и передать аргументы

person MadProgrammer    schedule 11.10.2012