在 Java 中将信息通过管道传输到另一个进程的首选方式是什么?

What is the preferred way of piping information into another process in Java?

我需要将数据通过管道传输到另一个进程。数据是一组字符串,我将它们连接成一个大字符串。外部进程接受一个文本文件。目前,我正在将字符串写入 ByteArrayOutputStream,但有更好的方法吗?

public OutputStream generateBoxFile() throws IOException {
    OutputStream boxStream = new ByteArrayOutputStream();
    for (String boxLine : boxLines) {
        boxLine += "\n";
        boxStream.write(boxLine.getBytes(Charset.forName("UTF-8")));
    }
    return boxStream;
}

编辑:为了进一步说明,我正在启动一个名为 trainer 的程序,它接受一个文本文件。所以我会在 shell ./trainer textfile 中像这样调用这个程序。但是,我想在内存中做所有事情,所以我正在寻找一种将数据写入不在磁盘上的临时文件然后将其提供给 trainer 的好方法。

将集合字符串写入文件的最简单方法是使用 PrintWriter

public static void writeToFile(String filename, Iterable<String> strings) {
    try (PrintWriter pw = new PrintWriter(filename)) {
       for(String str : strings)
            pw.println(str);
    }
}

如果您需要编写 UTF-8,您可以使用

更改编码
try (PrintWriter pw = new PrintWriter(
                      new OutputStreamWriter(new FileOutputStream(filename), "UTF-8")) {

您可以轻松地将数据传输到您通过其标准输入流启动的进程。在父进程中,可以通过Process.getOutputStream().

访问子进程的标准输入流

这确实需要您的子进程通过标准输入而不是文件接受数据。您的子进程目前从文件中获取输入。幸运的是,您在注释中指出您拥有子进程的代码。