调用jar并将其输出返回给另一个java程序

时间:2014-01-09 11:27:06

标签: java jar

我在java程序中调用jar。内部jar返回一些输出。我应该如何在以下程序中阅读和显示? 我能够成功调用jar但是如何显示输出?

import java.io.InputStream;
public class call_xml_jar {
public static void main(String argv[]) {

      try{

    // Run a java app in a separate system process
     Process proc = Runtime.getRuntime().exec("java -jar xml_validator.jar");

    // Then retreive the process output
     InputStream in = proc.getInputStream();
     InputStream err = proc.getErrorStream();
     System.out.println("Completed...");

      }
      catch (Exception e) {
            e.printStackTrace();
      }
 }
}

输出已完成... 我想打印jar输出

2 个答案:

答案 0 :(得分:1)

使用

InputStream in = proc.getInputStream();
InputStream err = proc.getErrorStream();

你已经在路上了。

这些流使您可以访问其他应用程序的标准输出和标准错误流(分别)。顺便说一下:通过调用getInputStream()来检索其他应用程序的标准输出流,因为这是当前应用程序的视图;您正在输入其他应用程序的数据。

只是说清楚:通过打印System.outSystem.err(分别)来调用应用程序中的标准输出和标准错误流。

因此,如果您在另一个应用程序中有 - 例如 - System.out.println("Hello world"),您将使用上述变量in检索输入流中的相应字节(见下文)代码段。

通常,您对字节不感兴趣,但是您想要检索已放入输出的String。所以你必须将字节转换为String。为此,您通常必须提供编码(Java类为Charset)。实际上,平台的默认编码在这种情况下有效。

最简单的方法是将输入流包装在缓冲的阅读器中:

BufferedReader outReader = new BufferedReader(new InputStreamReader(proc.getInputStream()));

当未在InputStreamReader的构造函数中指定任何字符集时,使用上面提到的平台的默认编码。

BufferedReader知道一个方法readLine(),你必须使用它来获取所有其他应用程序的输出。

while(outReader.ready())
    System.out.println(outReader.readLine())

关于刷新的一个词:如果您将数据写入标准输出流,则只有在写入换行符时才会刷新此流。这是通过调用System.out.println(...)来完成的。这就是为什么你必须阅读读者的全部内容的原因。

您现在能够组装一些读取其他应用程序输出的代码吗?如果没有,你可能会发布另一个问题。

答案 1 :(得分:0)

我自己解决了..这是我的解决方案......

// Then retreive the process output
 InputStream in = proc.getInputStream();
 InputStream err = proc.getErrorStream();
 System.out.println("Completed...");

 InputStreamReader is = new InputStreamReader(in);
 StringBuilder sb=new StringBuilder();
 BufferedReader br = new BufferedReader(is);
 String read = br.readLine();
 while(read != null) {
        //System.out.println(read);
        sb.append(read);
        sb.append("\n");
        read =br.readLine();
    }
 System.out.println(sb);