Запуск команды dd из java - PullRequest
0 голосов
/ 09 июля 2020

Когда мы запускаем dd без каких-либо параметров, по умолчанию он принимает ввод со стандартного ввода, а при обнаружении EOF (control + D) он снова выталкивает все, что было введено, на стандартный вывод.

Вид вот так

[ec2-user@ip ~]$ dd
This is line 1
This is line 2
This is line 1
This is line 2
0+2 records in
0+1 records out
30 bytes (30 B) copied, 9.7963 s, 0.0 kB/s
[ec2-user@ip ~]$

Я пытаюсь смоделировать то же самое в коде java.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {
    public static void main(String[] args) throws IOException {
        Process p = Runtime.getRuntime().exec("dd ");
        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String str = br.readLine();
        while (str != null) {
            System.out.println(str);
            str = br.readLine();
        }
    }
}

пока что я могу писать что-то в стандартный ввод, но я этого не делаю. я не знаю, как отправить EOF (я видел сообщения о том, как отправить EOF из java, но здесь ничего не работает).

Кроме того, я не знаю, как получить вывод из dd в стандартный вывод (т.е. с использованием java).

1 Ответ

2 голосов
/ 09 июля 2020

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

Например:

    Process p = Runtime.getRuntime().exec("dd ");

    PrintStream print = new PrintStream(p.getOutputStream());
    print.println("This is line 1");
    print.println("This is line 2");
    print.close(); // send EOF

    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String str = br.readLine();
    while (str != null) {
        System.out.println(str);
        str = br.readLine();
    }

как получить вывод из dd в стандартный вывод

You ' re уже делает это: поток, который вы получаете из Process.getInputStream, присоединяется к стандартному потоку вывода подпроцесса (опять же, это «входной» поток с точки зрения вашей программы), поэтому вы читаете из него и копируете то, что читаете, в System .out.

...