Java - Runtime.getRuntime().exec() что происходит?

У меня проблема с Runtime.exec() в Java. Мой код:

String lol = "/home/pc/example.txt";
String[] b = {"touch", lol}; 
try {  
    Runtime.getRuntime().exec(b);  
} catch(Exception ex) {  
    doSomething(ex);  
}

Это работает хорошо, но когда я пытаюсь изменить переменную "lol", файлы не создаются на жестком диске.

например: String lol = x.getPath(); где getPath() возвращает строку

Что я должен делать ?

Спасибо за ваш ответ :)


person kunkanwan    schedule 13.06.2010    source источник
comment
Не много занимался Java в Linux, но, возможно, проблема с разрешениями - может быть, песочница не позволяет создавать файлы вне домашнего каталога? Просто предположение, может что-то посмотреть.   -  person Kaleb Brasee    schedule 13.06.2010
comment
Спасибо за ответ, но я установил chmod 777, и когда я не использую файл getPath(), он появляется.   -  person kunkanwan    schedule 13.06.2010
comment
Примечание. Runtime#exec() не создает никаких исключений, если команда не выполнена. Вы хотите прочитать его вывод или поток ошибок. Также см. эту ссылку (все 4 страницы) javaworld. com/javaworld/jw-12-2000/jw-1229-traps.html   -  person BalusC    schedule 13.06.2010


Ответы (5)


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

   ProcessBuilder proc = new ProcessBuilder("<YOUR_DIRECTORY_PATH>" + "abc.exe"); // <your executable path> 
   proc.redirectOutput(ProcessBuilder.Redirect.INHERIT);  // 
   proc.directory(fi); // fi = your output directory
   proc.start();
person Asim Mushtaq    schedule 26.09.2013

Вероятно, вы используете java.io.File
В этом случае getPath() не возвращает абсолютный путь. Например:

System.out.println(System.getProperty("user.dir")); // Prints "/home/pc/"
// This means that all files with an relative path will be located in "/home/pc/"
File file = new File("example.txt");
// Now the file, we are pointing to is: "/home/pc/example.txt"
System.out.println(file.getPath()); // Prints "example.txt"
System.out.println(file.getAbsolutePath()); // Prints "/home/pc/example.txt"

Итак, вывод: используйте java.io.File.getAbsolutePath().

Совет: также существует метод java.io.File.getAbsoluteFile(). Это вернет абсолютный путь при вызове getPath().


Я только что прочитал ваш комментарий к другому ответу:

Я думаю, вы сделали:

String[] cmd = {"touch /home/pc/example.txt"};
Runtime.getRuntime().exec(cmd);

Это не сработает, потому что ОС ищет приложение с именем "touch /home/pc/example.txt".
Теперь вы думаете: "Что за хрень? Почему?"
Потому что метод Runtime.getRuntime().exec(String cmd); разбивает вашу строку на пробелы. И Runtime.getRuntime().exec(String[] cmdarray); не разделяет его. Итак, вы должны сделать это самостоятельно:

String[] cmd = {"touch", "/home/pc/example.txt"};
Runtime.getRuntime().exec(cmd);
person Martijn Courteaux    schedule 13.06.2010

Просто посмотрите на содержимое лол, когда вы позвонили x.getPath(). Я предполагаю, что это не абсолютный путь, и файл создается, но не там, где вы ожидаете.

Это x является Java.io.File us getCanonicalPath() для абсолютного пути.

person ZeissS    schedule 13.06.2010
comment
Хороший вопрос, но если я напечатаю x.getPath(), результат будет равен /home/pc/example.txt. Это должно быть в порядке. Когда я использую Runtime.getRuntime().exec(touch /home/pc/example.txt), он работает нормально, но когда я пытаюсь использовать функцию, она не работает. - person kunkanwan; 13.06.2010

Если код работает, когда вы устанавливаете строку в литерал «/home/pc/example.txt», и x.getPath также возвращает то же значение, то он ДОЛЖЕН работать — это так просто. Это означает, что x.getPath() на самом деле возвращает что-то еще. Может в строке есть пробел? Попробуйте сравнить строки напрямую:

if (!"/home/pc/example.txt".equals(x.getPath())) throw new RuntimeException();
person Mike Baranczak    schedule 13.06.2010

как написать код для реального пути

String path = request.getSession().getServletContext().getRealPath("/");

здесь вы можете получить реальный путь ..........

person sameer    schedule 04.01.2013