Вызывать оболочку Unix из Java-программы - читать и записывать постоянный поток данных в и из Unix-канала из Java-программы. - PullRequest
4 голосов
/ 09 ноября 2010

У меня 2 вопроса

1) как мне вызвать оболочку unix из библиотеки java.runtime для запуска такой команды

Процесс p = Runtime.getRuntime (). Exec (команды);

псевдоним кошки> предвзятость

2) Как я могу читать и записывать в канал Unix устойчивый поток данных из Java. Должен ли я сделать все системные вызовы, такие как открытое чтение, запись в канал

Я в основном хочу повторить эту команду

псевдоним кошки> предвзятость

где стабильный поток данных будет поступать из Java-программы в предвзятость, а не в псевдоним Cat.

Ответы [ 3 ]

6 голосов
/ 07 декабря 2011

Начиная с JDK7, есть удобный способ сделать это:

ProcessBuilder pb = new ProcessBuilder("cat", "alias");
File bias = new File("bias");
pb.redirectOutput(Redirect.appendTo(bias));
pb.start();

Ссылка: ProcessBuilder # redirectOutput

3 голосов
/ 09 ноября 2010

Вы можете вызвать оболочку Unix, как если бы вы вызывали любую другую программу.Используйте параметр -c, чтобы передать команду для запуска в качестве параметра.Также убедитесь, что вы используете метод exec(String[]), а не exec(String), чтобы избежать неправильной маркировки команды:

String[] cmd = {"/bin/sh", "-c", "/bin/cat alias > bias"};
Process p = Runtime.getRuntime().exec(cmd);

Для чтения и записи в / из процесса, получите ввод,выходные данные и потоки ошибок из только что созданного экземпляра Process:

InputStream in = p.getInputStream();
InputStream err = p.getErrorStream();
OutputStream out = p.getOutputStream();

Затем считывайте / записывайте в эти потоки как обычно.

Обратите внимание, что потоки именуются относительно Javaприложение.Все, что записано в OutputStream, передается на стандартный ввод созданного вами процесса.Все, что записано процессом в stdout / stderr, передается в InputStream s, полученных из p.getInputStream() и p.getErrorStream() соответственно.

Ссылка: http://download.oracle.com/javase/6/docs/api/java/lang/Process.html

1 голос
/ 09 ноября 2010

Вы не можете использовать «>» напрямую в команде Runtime.exec ().Он не будет иметь ожидаемого эффекта и не перенаправит вывод в файл.

Вы должны получить поток ввода вашего процесса и перенаправить его в файл для записи:

Process p = Runtime.getRuntime().exec(new String[] {"cat", "alias"});
InputStream in = p.getInputStream();
FileOutputStream fos = new FileOutputStream("yourFile");
// Write in into fos...
// handle the process streams

Я не детализирую метод написания, но:

  • вы должны обработать исключения (IO)
  • вы должны использовать (по крайней мере, чтобы закрыть) весь процесспотоки (ошибка, ввод, вывод).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...