这是我的问题here的第二部分。
我现在有一个流程,但我想知道如何从流程中获取输出?
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数组。我如何获得阵列?我正在调用exec()的方式是正确的吗?
答案 0 :(得分:2)
public static void main
(不是Object
作为返回类型)ObjectOutputStream
序列化对象(所有必要的示例都在javadoc中)exec()
的程序中,使用process.getOutputStream()
OutputStream
(ObjectInputStream
)现在,这是一种奇怪的方式,但由于我不确切地知道你想要实现什么,这听起来很合理。
答案 1 :(得分:1)
如果您希望将流程的结果直接打印到标准输出,则可以执行System.setOut(new PrintStream(p.getOutputStream()))
。当然,这将覆盖旧的标准输出。但你也可以使用进程的输出流做其他事情,比如有一个从中读取的线程。
代码的一个问题是类的主要功能必须是void
类型,并且不会返回任何内容。您将无法在进程之间传递Java对象,因为它们在不同的JVM中运行。如果你必须这样做,你可以将对象序列化为磁盘,但我想你甚至不需要在一个单独的进程中运行它。
答案 2 :(得分:0)
mediaProp
是main()
方法中的局部变量。它无法从外部访问。
你必须稍微重新设计你的mediaProperty类。
答案 3 :(得分:0)
首先,你应该使用:
"java -cp . mediaProperty " + filename
用于调用java进程。 "-cp ."
定义了类路径,我假设编译了java文件,生成的类文件与执行过程位于同一路径。
然后,您需要在标准输出处打印结果,而不是仅返回它。最后,请阅读此article以阅读输出。
答案 4 :(得分:0)
有一些问题。
在exec中你假设java在路径上,文件名应该是完全限定的,或者你应该知道java进程的当前工作目录是正常的。
main()应返回void(无)。如果您想将结果传递出程序,请使用以下内容:
for (Object o : mediaProp) {
System.out.println(o);
}
并在输入流(调用软件)上再次解析它。
更好的是,在java路径中包含MediaProperty类并直接调用main(...)而不是调用单独的java进程。