(Java) Runtime.exec 中的文件重定向(双向)?

Posted

技术标签:

【中文标题】(Java) Runtime.exec 中的文件重定向(双向)?【英文标题】:(Java) File redirection (both ways) within Runtime.exec? 【发布时间】:2011-07-22 20:47:08 【问题描述】:

我要执行这个命令:

/ceplinux_work3/myName/opt/myCompany/ourProduct/bin/EXECUTE_THIS -p cepamd64linux.myCompany.com:19021/ws1/project_name < /ceplinux_work3/myName/stressting/Publisher/uploadable/00000.bin >> /ceplinux_work3/myName/stressting/Publisher/stats/ws1.project_name.19021/2011-07-22T12-45-20_PID-2237/out.up

但它不起作用,因为 EXECUTE_THIS 需要通过重定向输入文件,并且简单地将这个命令传递给 Runtime.exec 不起作用。

旁注:我在来这里询问之前搜索了如何解决这个问题。网上有很多关于 Runtime.exec 和输入/输出重定向的问题/文章。但是,我找不到任何处理将文件传递给命令并将结果输出到另一个文件的方法。另外,我对输入/输出流完全不熟悉,所以我很难根据我的具体情况将所有信息放在一起。

也就是说,非常感谢任何帮助。

附:如果有多种方法可以做到这一点,我更喜欢吞吐量方面最快的方法。

编辑:正如我在上一个问题中所讨论的,我不能将其更改为 bash 调用,因为程序必须等待此过程完成才能继续。

【问题讨论】:

【参考方案1】:

除非您将文件 name 发送到进程的标准输入,否则数据是来自文件还是来自任何其他数据源没有区别。

您需要写信给Process.getOutputStream() 提供的OutputStream。您写入的数据可以使用FileInputStream 从文件中读取in

把它们放在一起可能看起来像这样:

    Process proc = Runtime.getRuntime().exec("...");

    OutputStream standardInputOfChildProcess = proc.getOutputStream();
    InputStream dataFromFile = new FileInputStream("theFileWithTheData.dat");

    byte[] buff = new byte[1024];
    for ( int count = -1; (count = dataFromFile.read(buff)) != -1; ) 
        standardInputOfChildProcess.write(buff, 0, count);
    

我遗漏了很多细节,这只是为了了解它的要点。你会想要安全地关闭东西,可能想要考虑缓冲,你需要担心pitfalls of Runtime.exec()

编辑

将输出写入文件是类似的。获取一个指向输出文件的FileOutputStream 并将您从Process.getInputStream() 读取的数据写入该OutputStream。这里的主要警告是您必须在第二个线程中执行此操作,因为从同一个线程访问两个阻塞流会导致死锁(请参阅上面的文章)。

【讨论】:

我明白了。但是,我想模拟对程序的实际调用会发生什么,因为这是压力测试的模拟,并且我正在收集此特定调用的吞吐量数据。因此,根据缓冲区大小,结果会出现偏差,不是吗? 或者,我想,更好的措辞:我应该使用多大的缓冲区来最好地模拟真实的呼叫? (如果这甚至是一个问题。) @Ryan:应该没什么区别。我不知道你应该使用什么缓冲区大小,因为我不知道你的确切环境或你如何输入输入。如果您只是以硬盘驱动器所能提供的速度发送数据并且进程可以接收它,那么上面的代码将非常接近它。

以上是关于(Java) Runtime.exec 中的文件重定向(双向)?的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.Runtime.exec() Payload

使用 Java Runtime.exec() 在 Hadoop 上运行命令

调用 Runtime.exec 时捕获标准输出

java中的命令执行汇总

使用 Process.runtime.exec 记录到 syslog

Runtime.exec()