Стоит отметить, что это гораздо менее эффективно, чем os-native pipe, поскольку вы копируете память в адресное пространство процесса Java, а затем возвращаетесь к последующему процессу.

отрим следующий код:

String commandf = "ls /etc | grep release";

try {

    // Execute the command and wait for it to complete
    Process child = Runtime.getRuntime().exec(commandf);
    child.waitFor();

    // Print the first 16 bytes of its output
    InputStream i = child.getInputStream();
    byte[] b = new byte[16];
    i.read(b, 0, b.length); 
    System.out.println(new String(b));

} catch (IOException e) {
    e.printStackTrace();
    System.exit(-1);
}

Вывод программы:

/etc:
adduser.co

Когда я запускаю из оболочки, конечно, она работает как положено:

poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release

Интернет-специалисты говорят мне, что из-за того, что поведение канала не является кроссплатформенным, блестящие умы, работающие на фабрике Java, производящей Java, не могут гарантировать, что каналы работают.

Как я могу это сделать?

Я не собираюсь делать все мои разбор с использованием конструкций Java, а неgrep а такжеsedпотому что, если я захочу сменить язык, я буду вынужден переписать свой код синтаксического анализа на этом языке, что полностью запрещено.

Как я могу заставить Java выполнять конвейерную передачу и перенаправление при вызове команд оболочки?