【问题标题】:Executing terminal command from java [duplicate]从java执行终端命令[重复]
【发布时间】:2014-03-09 20:20:55
【问题描述】:

我是 Java 新手,正在学习它。我想从 java 类运行一个命令行程序。

这是我要运行的命令:(仅限 linux)

path/to/folder/$ echo "Inhibition of NF-kappaB activation reversed the anti-apoptotic effect of isochamaejasmin." | ./geniatagger

这将为我提供我想要存储在 java 对象中的输出。

字符串输出:

抑制 抑制 NN B-NP O 的 IN B-PP O NF-kappaB NF-kappaB NN B-NP B-蛋白 激活 激活 NN I-NP O 反向 反向 VBD B-VP O DT B-NP O 抗凋亡 抗凋亡 JJ I-NP O 效果 效果 NN I-NP O 的 IN B-PP O isochamaejasmin isochamaejasmin NN B-NP O . . .哦哦

请指导我如何实现这一目标?

【问题讨论】:

  • @juan.facorro 提出的解决方案不是最理想的。对于 OP:这是什么“我想存储在 java 对象中的一些输出”?字符串输出?二进制输出?
  • 您真的需要echo 还是可以直接在Java 中完成管道输出?
  • 我现在看到你的问题的方式与我发布答案时不同。 ./geniatagger 应该是你的程序吗?你会写吗?在 Java 中?
  • @StijndeWitt 是的 geniatagger 是 (unix) 命令行工具,它对文本进行命名实体识别并产生输出..
  • 它是现有的 unix 工具还是您正在编写?如果您使用 Java 编写它,那么调用看起来会有些不同,因为您不会像那样直接执行 Java 程序。相反,你会打电话给java -jar geniatagger.jar 或类似的东西。在 geniatagger 程序中,您可以通过访问标准输入来读取输入的文本。我更新了答案。

标签: java terminal


【解决方案1】:

命令行解释器,通常称为 shell,是 Java 不支持的典型平台特定功能。这并不是说不可能,但是您必须问自己是否希望此功能在所有平台上都可以使用。

如果不关心多平台,可以关注Runtime.exec

例如:

Runtime.getRuntime().exec("cmd /c echo Hello World!");

如果你真的关心,也许你最好直接从 Java 做同样的事情。大多数 shell 命令可以直接从 Java 中实现,无需太多代码。然后它将是跨平台的,并且性能通常会更好。

如果您决定调用 shell 命令,以对它的输出采取行动,请学习如何访问标准输入/输出流。看this example

更新

我想我现在看到你可能想编写一个程序 ./geniatagger 来接受来自命令行的输入,例如管道的“回声”的输出等?

如果是这样,请查看使用标准输入流System.in

【讨论】:

  • 不,请,不。至少,建议使用 ProcessBuilder 而不是 Runtime.exec() :/
  • 为什么?我用什么有效。 Runtime.exec 有效。如果他愿意牺牲“编写一次,随处运行”,那么 a)它不够重要,不需要关心,或者 b)他想要调用的代码非常特殊/受版权保护/秘密/无论什么(我假设“回声”来自这个问题只是一个例子)
  • ProcessBuilder 更好地支持流重定向、更好的 cmd/参数处理和要求,并且通常更易于使用
  • 你好@MadProgrammer,我听说过ProcessBuilder,我会试着读一读,你能给我发个例子或网站吗。
最近更新 更多