当前位置: 首页 > 面试题库 >

如何通过管道将InputStream传递给ProcessBuilder

斜昊空
2023-03-14
问题内容

请移至第二次更新。 我不想更改此问题的先前上下文。

我正在使用Java应用程序中的wkhtmltoimage。

使用它的标准方法是- path-to-exe http://url.com/ image.png

根据他们的文档,如果我们编写一个-URL而不是输入URL,则输入将转换为STDIN。

我正在使用ProcessBuilder-

ProcessBuilder pb = new ProcessBuilder(exe_path, " - ", image_save_path);

Process process = pb.start();

现在,我无法弄清楚如何将输入流传输到此过程。

我有一个读入的模板文件DataInputStream,并在末尾附加了一个字符串:

DataInputStream dis = new DataInputStream (new FileInputStream (currentDirectory+"\\bin\\template.txt"));
byte[] datainBytes = new byte[dis.available()];
 dis.readFully(datainBytes);
 dis.close();

 String content = new String(datainBytes, 0, datainBytes.length);

 content+=" <body><div id='chartContainer'><small>Loading chart...</small></div></body></html>";

如何通过管道content传递到STDIN流程的?

更新-

遵循Andrzej Doyle的回答:

我已使用getOutputStream()的过程:

ProcessBuilder pb = new ProcessBuilder(full_path, " - ", image_save_path);

    pb.redirectErrorStream(true);

    Process process = pb.start();

    System.out.println("reading");

    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));

    bw.write(content);

这样做会显示错误消息:

Exception in thread "main" java.io.IOException: The pipe has been ended

第二次更新--------

当前代码块如下:

    try {
        ProcessBuilder pb = new ProcessBuilder(full_path, "--crop-w", width, "--crop-h", height, " - ", image_save_path);
        System.out.print(full_path+ "--crop-w"+ width+ "--crop-h"+ height+" "+ currentDirectory+"temp.html "+ image_save_path + " ");
        pb.redirectErrorStream(true);

        Process process = pb.start(); 
        process.waitFor();
        OutputStream stdin = process.getOutputStream();

        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));
// content is the string that I want to write to the process.

        writer.write(content);
        writer.newLine();  
        writer.flush();
        writer.close();


    } catch (Exception e) {
        System.out.println("Exception: " + e);
        e.printStackTrace();
    }

运行上面的代码给我一个 IOException: The pipe is being closed.

我还需要做什么来保持管道畅通?


问题答案:

从中删除空格" - "-Shell解析器将删除常规空格,但是在中ProcessBuilder,它被解释为以空格开头和结尾的(文字)文件名。

(实际上,按照Peter的建议查看流程的输出可能会告诉您…)



 类似资料:
  • 问题内容: 如何将以下代码转换为使用流/管道,从而无需将全部内容读入内存?就像是: 问题答案: 怎么样 可以在以下位置找到其文档:http : //golang.org/pkg/io/#Copy 不过,这很简单。给它一个和一个,然后一次将数据复制到一个小块上(例如,一次不全部存储在内存中)。 因此,您可以尝试编写如下内容: 我还没有测试以上内容;我只是从您上面的示例中快速地将其攻破,但是如果没有钱

  • 因此,在这里我将basePackages硬编码为“com.example”。这不是我想要的。我想通过命令行参数从终端运行应用程序时接收包名。有没有一种方法可以将命令行参数传递给应用程序,并使用我在BasePackages中接收到的参数?提前致谢

  • 问题内容: 我试图找到定义可以以一般方式使用的组件的正确方法: 当然,可以想象并在父组件和子组件之间进行渲染的逻辑。 对于这个问题,这是一个虚拟的实现: 问题是,每当您用于定义包装器组件时,如何将某些属性传递给其所有子组件? 问题答案: 用新道具克隆Children 您可以使用React.Children遍历子级,然后使用React.cloneElement使用新的道具(浅合并)克隆每个元素,例如

  • 我正在尝试从使用自由式詹金斯构建切换到管道项目。 我喜欢它的许多方面,但我希望我可以使用多分支管道,因为它更适合我们公司,但目前这不是一个选择。 我们目前所做的是创建一个名为

  • 问题内容: 我正在尝试找到定义可以以一般方式使用的某些组件的正确方法: 当然,您可以想象并作为该逻辑的示例,在父组件和子组件之间存在一种渲染逻辑。 对于这个问题,这是一个虚拟的实现: 问题是,每当您用于定义包装器组件时,如何将某些属性传递给其所有子组件? 问题答案: Cloning children with new props 您可以使用React.Children遍历子级,然后使用React.

  • 我是一个相当新的反应,这是一个我正在努力解决的问题。