从流程中获取输出

时间:2010-01-05 16:28:00

标签: java

这是我的问题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()的方式是正确的吗?

5 个答案:

答案 0 :(得分:2)

  1. 使用public static void main(不是Object作为返回类型)
  2. 使用ObjectOutputStream序列化对象(所有必要的示例都在javadoc中)
  3. 唯一与示例不同的是构造 - 构造它     ObjectOutputStream oos = new ObjectOutputStream(System.out);
  4. 在调用exec()的程序中,使用process.getOutputStream()
  5. 获取输出
  6. 根据已审核的OutputStreamObjectInputStream
  7. 读入check this
  8. 反序列化对象(请参阅ObjectInputStream的javadoc)
  9. 现在,这是一种奇怪的方式,但由于我不确切地知道你想要实现什么,这听起来很合理。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

你必须稍微重新设计你的mediaProperty类。

答案 3 :(得分:0)

首先,你应该使用:

"java -cp . mediaProperty " + filename

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

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

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

答案 4 :(得分:0)

有一些问题。

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

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

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

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

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