Выполнение внешней программы на Java - PullRequest
1 голос
/ 22 марта 2012

Я пытаюсь запустить "cut" внутри Java-программы, но я теряюсь в том, как разделить массив команд Моя программа в командной строке выглядит следующим образом:

cut file.txt -d' ' -f1-2  > hits.txt

И я пытаюсь запустить его в Java, как это

Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(new String[]{"file.txt"," -d' ' -f1-2 "," > hits.txt"});
pr.waitFor();

Но я получаю следующую ошибку во время выполнения

Exception in thread "main" java.io.IOException: Cannot run program "cut file.txt": java.io.IOException: error=2, No such file or directory

Я приписываю эту ошибку массиву строк, которые я использую как команды exec. Есть идеи, как это сделать? Также любая известная документация по этому вопросу. Спасибо

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Сделайте либо скрипт для bash:

"/bin/bash" "-c" "cut file.txt -d' ' -f1-2  > hits.txt"

или разделить

"cut" "file.txt" "-d" "' '" "-f" "1-2" 

В сообщении об ошибке четко сказано:

Cannot run program "cut file.txt"

, поэтому он интерпретирует «cut file.txt» как одно имя программы с пробелом внутри.

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

"cut" "file.txt" "-d" "' '" "-f" "1-2" ">" "hits.txt"

Вы должны обрабатывать потоки ввода и вывода. Возможно, было бы лучше реализовать cut в Java, чтобы получить переносимое решение или вызвать скрипт, который пользователь может указать в командной строке или в файле конфигурации, чтобы его можно было адаптировать для Windows или других платформ.

Вызов / bin / bash и перенаправление туда должны работать - на Unix-подобных системах.

1 голос
/ 22 марта 2012

Если вы хотите перенаправить вывод, вы должны сделать это самостоятельно. > hits.txt не будет делать то, что вы хотите. Перенаправление stdout из процесса, вызываемого exec, охватывается другим вопросом StackOverflow .

Ошибка, которую вы показываете, не соответствует исходному коду, который вы перечислили здесь - нет источника для cut, с одной стороны. Он определенно пытается понять cut file.txt как полный относительный путь к одному исполняемому файлу с пробелом в имени, что почти наверняка не то, что вы хотите. Было бы проще устранить неисправность с помощью правильного кода.

...