运行 来自 java 的 dd 命令

Running dd command from java

当我们 运行 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(我看过关于如何从 java 发送 EOF 的帖子,但这里似乎没有任何作用) .

此外,我不知道如何将 dd 的输出输出到标准输出(即使用 java)。

要写入子进程的标准输入流,您可以使用来自 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();
    }

how get the output from dd to the standard output

你已经这样做了:你从 Process.getInputStream 获得的流附加到子进程的标准输出流(同样,从你的程序的角度来看,它是一个“输入”流),所以你阅读从中复制你读到的内容到 System.out.