2

我想执行这个命令:

/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 和输入/输出重定向的问题/文章。但是,我找不到任何处理将文件传递给命令并将结果输出到另一个文件的方法。另外,我对输入/输出流完全不熟悉,所以我很难根据我的具体情况将所有信息放在一起。

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

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

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

4

1 回答 1

2

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

您需要写入给OutputStream定的 by Process.getOutputStream()。您写入的数据可以使用FileInputStream.

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

    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);
    }

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

编辑

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

于 2011-07-22T20:58:40.690 回答