【问题标题】:Get output from a process从进程中获取输出
【发布时间】:2010-01-06 16:01:31
【问题描述】:

这是我的问题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 将返回一个对象。这里面实际上是字符串数组。我如何获得数组?我调用 exec() 的方式正确吗?

【问题讨论】:

  • 不是用public static void main(...)代替Object吗?
  • 尽管类名通常以大写开头并不重要; mediaProperty -> MediaProperty.
  • 如果我不返回一些东西,我如何得到我的输出?

标签: java


【解决方案1】:
  1. 使用public static void main(不是Object作为返回类型)
  2. 使用ObjectOutputStream 序列化对象(所有必要的示例都在javadoc 中)
  3. 与示例唯一不同的是构造 - 像这样构造 ObjectOutputStream oos = new ObjectOutputStream(System.out);
  4. 在调用exec()的程序中,得到process.getOutputStream()的输出
  5. 根据已经检索到的OutputStream (check this) 读入ObjectInputStream
  6. 反序列化对象(参见 ObjectInputStream 的 javadoc)

现在,这是一种奇怪的方法,但由于我不知道你想要达到什么目的,这听起来很合理。

【讨论】:

  • @Bozho:“将 Java OutputStream 转换为 InputStream”链接中的 class1 和 class2 是什么?
  • class1 是流程实例。您不需要的 Class2 - 您将从 ByteArrayInputStream 中创建 ObjectInputStream
  • 对不起,我不明白。我知道我需要将 ObjectInputStream 的“输出”链接到 process.getOutputStream。没有“putDataOnOutputStream”这样的方法吧?
  • 你可以问另一个问题
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      首先,你应该使用:

      "java -cp . mediaProperty " + filename
      

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

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

      • 提示 1:将类重命名为 MediaProperty
      • 提示 2:为什么不直接从代码中调用 MediaProperty 类?是否需要启动新流程?

      【讨论】:

      【解决方案5】:

      有一些陷阱。

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

      main() 应该返回 void(无)。如果您想将结果从程序中传递出去,请使用类似:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-21
        • 2021-04-15
        • 2015-06-08
        • 1970-01-01
        相关资源
        最近更新 更多