Java打开外部脚本并提供输入/获取输出

时间:2011-01-05 14:02:08

标签: java input external

好的,还在研究一个科学项目,该项目涉及使用不同语言测试通过互联网发送数据的速度。我的老师似乎认为这不够困难,并希望我运行一个主要的Java程序来控制客户。

我已经想出了如何运行外部文件(但文件名中的空格仍有问题),并且很好。我的麻烦是我需要以某种方式与已打开的客户端(我有Python,C,C ++,Java和Ruby客户端)进行测试次数,并且我需要获取通过测试获得的数据集。 / p>

最后,我需要了解如何从java发送输入到Python,C,C ++,Java和Ruby脚本并收集它们的输出以放入java。作为最后的手段,我可​​能有一个文本文件充当主java程序和每个客户端之间的中介。这不是一个非常优雅的解决方案,所以我宁愿避免它。

2 个答案:

答案 0 :(得分:1)

您可能正在寻找JNI - Java Native Interface。 JNI肯定会满足老师对困难的要求。 JNI允许Java代码在其他语言中调用代码并获得响应,就像调用Java方法一样。我在JNI中遇到的最大问题是本机(C,C ++等)代码中的崩溃也会导致Java程序崩溃。 JNI将为您的应用程序创建当前的外部脚本内部代码,并且可能比您需要的更难。

对于更简单的解决方案,您可能希望查看Java中的ProcessBuilder类。例如:

ProcessBuilder pb = new ProcessBuilder("myshellScript.sh", "myArg1", "myArg2");
Map<String, String> env = pb.environment();
env.put("VAR1", "myValue");
env.remove("OTHERVAR");
env.put("VAR2", env.get("VAR1") + "suffix");
pb.directory("myDir");
Process p = pb.start();
InputStream is = p.getInputStream();
// use process p's input stream is to provide input to your process here
OutputStream os = p.getOutputStream();
// use process p's output stream to get the results here

答案 1 :(得分:0)

您可以考虑使用某些跨语言API在每个Java,C / C ++,Ruby和Python的运行实例之间发送消息。

  • Spread(似乎没有Ruby支持)
  • RabbitMQ(AMQP)支持您列出的所有语言,然后支持一些。
  • DBus支持您列出的所有语言,然后支持一些。
  • Apache Thrift支持您列出的所有语言,然后支持一些。
  • HTTP和Google ProtocolBuffers支持所有列出的语言,然后支持一些。

它比使用文本文件作为中介要复杂一些,但可能更具性能和可扩展性。

//尼古拉斯