从流程中获取输出
这是我的问题的第二部分。
我现在有一个进程,但我想知道如何从进程中获取输出?
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()的方式是正确的吗?
- 使用
public static void main
(而不是Object
作为返回类型) - 使用
ObjectOutputStream
序列化对象(所有必需的示例都在javadoc中) - 与示例唯一不同的是构造 – 构造它像ObjectOutputStream oos = new ObjectOutputStream(System.out);
- 在调用
exec()
的程序中,使用process.getOutputStream()
获取输出 - 根据已经检索过的
OutputStream
读入ObjectInputStream
( 检查一下 ) - 反序列化对象(请参阅ObjectInputStream的javadoc)
现在,这是一种奇怪的方式,但由于我不确切地知道你想要实现什么,这听起来很合理。
如果您希望让进程将结果直接打印到标准输出,您可以执行System.setOut(new PrintStream(p.getOutputStream()))
。 当然,这将覆盖旧的标准输出。 但是你也可以使用进程的输出流做其他事情,比如有一个从中读取的线程。
代码的一个问题是类的主要function必须是void
类型,并且不返回任何内容。 您将无法在进程之间传递Java对象,因为它们在不同的JVM中运行。 如果你必须这样做,你可以将对象序列化为磁盘,但我想你甚至不需要在一个单独的进程中运行它。
mediaProp
是main()
方法中的局部变量。 它无法从外部访问。
您将不得不重新设计一下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进程。