从流程中获取输出

这是我的问题的第二部分。

我现在有一个进程,但我想知道如何从进程中获取输出?

String filename = matlab.getfileName(); Process p = Runtime.getRuntime().exec("java -cp mediaProperty.java " + filename); 

我的mediaProperty.java:

 public class mediaProperty { public static Object main(String[] args) { Object[] mediaProp = null; java.util.List lstMedia = new ArrayList(); Media media = null; try { media = new Media(); lstMedia.add(args); mediaProp = media.media(3, lstMedia); } catch (Exception p) { System.out.println("Exception: " + p.toString()); } finally { MWArray.disposeArray(mediaProp); if (media != null) { media.dispose(); } } return mediaProp; } } 

mediaProperty.java将返回一个Object。 这里面实际上是String数组。 我如何获得arrays? 我正在调用exec()的方式是正确的吗?

  1. 使用public static void main (而不是Object作为返回类型)
  2. 使用ObjectOutputStream序列化对象(所有必需的示例都在javadoc中)
  3. 与示例唯一不同的是构造 – 构造它像ObjectOutputStream oos = new ObjectOutputStream(System.out);
  4. 在调用exec()的程序中,使用process.getOutputStream()获取输出
  5. 根据已经检索过的OutputStream读入ObjectInputStream ( 检查一下 )
  6. 反序列化对象(请参阅ObjectInputStream的javadoc)

现在,这是一种奇怪的方式,但由于我不确切地知道你想要实现什么,这听起来很合理。

如果您希望让进程将结果直接打印到标准输出,您可以执行System.setOut(new PrintStream(p.getOutputStream())) 。 当然,这将覆盖旧的标准输出。 但是你也可以使用进程的输出流做其他事情,比如有一个从中读取的线程。

代码的一个问题是类的主要function必须是void类型,并且不返回任何内容。 您将无法在进程之间传递Java对象,因为它们在不同的JVM中运行。 如果你必须这样做,你可以将对象序列化为磁盘,但我想你甚至不需要在一个单独的进程中运行它。

mediaPropmain()方法中的局部变量。 它无法从外部访问。

您将不得不重新设计一下mediaProperty类。

首先,你应该使用:

 "java -cp . mediaProperty " + filename 

用于调用java进程。 "-cp ." 定义类路径,我假设编译了java文件,生成的类文件与执行过程位于同一路径。

然后,您需要在标准输出处打印结果,而不是仅返回它。 最后,阅读本文以阅读输出。

  • 提示1:将类重命名为MediaProperty
  • 提示2:为什么不直接从代码中调用MediaProperty类? 是否有必要开始一个新的过程?

有一些问题。

在exec中你假设java在路径上,文件名应该是完全限定的,或者你应该知道java进程的当前工作目录是正常的。

main()应返回void(无)。 如果您想将结果传递出程序,请使用以下内容:

 for (Object o : mediaProp) { System.out.println(o); } 

并在输入流(调用软件)上再次解析它。

更好的是,在java路径中包含MediaProperty类并直接调用main(…)而不是调用单独的java进程。