// Execute the command and wait for it to complete Processchild= Runtime.getRuntime().exec(commandf); child.waitFor();
// Print the first 16 bytes of its output InputStreami= child.getInputStream(); byte[] b = newbyte[16]; i.read(b, 0, b.length); System.out.println(newString(b));
Когда я запускаю из оболочки, конечно, все работает так, как ожидалось:
poundifdef@parker:~/rabbit_test$ ls /etc | grep release lsb-release
В Интернете мне говорят, что из-за того, что поведение канала не является кроссплатформенным, блестящие умы, работающие на Java factory, производящей Java, не могут гарантировать, что каналы работают.
Как я могу это сделать?
Я не собираюсь выполнять весь свой синтаксический анализ, используя конструкции Java вместо grep и sed, потому что, если я захочу изменить язык, я буду вынужден переписывать свой синтаксический код на этом языке, что совершенно недопустимо.
Как я могу заставить Java выполнять конвейер и перенаправление при вызове команд оболочки?
Переведено автоматически
Ответ 1
Напишите скрипт и выполняйте скрипт вместо отдельных команд.
Канал является частью оболочки, поэтому вы также можете сделать что-то подобное:
Я столкнулся с аналогичной проблемой в Linux, за исключением того, что это был "ps -ef | grep someprocess". По крайней мере, с "ls" у вас есть независимая от языка (хотя и более медленная) замена Java. Например.:
Filef=newFile("C:\\"); String[] files = f.listFiles(newFile("/home/tihamer")); for (String file : files) { if (file.matches(.*some.*)) { System.out.println(file); } }
С "ps" это немного сложнее, потому что в Java, похоже, нет API для этого.
Что касается того, почему массив строк работает с каналом, в то время как отдельная строка - нет ... это одна из загадок вселенной (особенно если вы не читали исходный код). Я подозреваю, что это потому, что когда exec получает единственную строку, он сначала анализирует ее (способом, который нам не нравится). Напротив, когда exec получает массив строк, он просто передает его операционной системе без синтаксического анализа.