当前位置: 首页 > 面试题库 >

如何在此Java程序中读取另一个Java程序的std输出?

毋炳
2023-03-14
问题内容

我编写了一个简单的Java程序,该程序每5秒就会向std输出一些“ hello”。

public class DDD {
    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; ; i++) {
            System.out.println("hello " + i);
            Thread.sleep(5000);
        }
    }
}

然后我编译它并得到一个.class。

我编写了另一个Java程序来运行它并获得输出:

public static void main(String[] args) throws Exception {
    String command = "c:\\java\\jdk1.7.0_07\\bin\\java mytest.DDD";
    Process exec = Runtime.getRuntime().exec(command);

    BufferedReader reader = new BufferedReader(new InputStreamReader(exec.getInputStream()));
    while (true) {
        String line = reader.readLine();
        System.out.println(line);
        if (line == null) {
            Thread.sleep(1000);
        }
    }
}

但是它总是打印:

null
null
null
null
null
null
null

哪里错了?我的操作系统是“ Windows XP”。


问题答案:

BufferedReader#readLine``null到达流的末尾时将返回。

因为您基本上是在忽略此退出指示器并无限循环地循环,所以您得到的只是null

可能的原因是因为该进程已向错误流输出了一些错误信息,而您没有阅读这些信息。

您应该尝试使用ProcessBuilder代替,这使您可以将错误流重定向到输入流中。

try {
    String[] command = {"java.exe", "mytest.DDD"};
    ProcessBuilder pb = new ProcessBuilder(command);
    // Use this if the place you are running from (start context)
    // is not the same location as the top level of your classes
    //pb.directory(new File("\path\to\your\classes"));
    pb.redirectErrorStream(true);
    Process exec = pb.start();

    BufferedReader br = new BufferedReader(new InputStreamReader(exec.getInputStream()));
    String text = null;
    while ((text = br.readLine()) != null) {
        System.out.println(text);
    }
} catch (IOException exp) {
    exp.printStackTrace();
}

ps-如果java.exe您的路径有效,则可以使用,否则,您将需要提供可执行文件的完整路径,就像您在示例中已经完成的一样;)



 类似资料:
  • 问题内容: 我有一个Main.java和Test.java类,它们要编译并在Test.java代码中运行Main.java。这是我的代码 我只在Main.java中打印“ ok”,但是此代码不打印任何内容。问题是什么 ? 问题答案: 我修改了代码以包括一些检查: 这是Main.java: 当一切都很好时,它就可以工作: 现在,例如,如果在Main.java中出现一些错误: 它仍然显示“ ok”,因

  • null (如果可能的话,它应该在db中创建表并生成html文件。我看到了http://velocity.apache.org/,所以是否可以使用它生成java代码。)

  • 问题内容: 我编写了几个简单的Java应用程序,分别称为A.jar,B.jar。 现在,我想编写一个GUI Java程序,以便用户可以按按钮A执行A.jar,按按钮B执行B.jar。 我也想在我的GUI程序中输出运行时进程的详细信息。 有什么建议吗? 问题答案: 如果我理解正确,那么看来你想在Java GUI应用程序内部的单独进程中运行jar。 为此,你可以使用: 缓冲过程输出始终是一种很好的做法

  • 问题内容: 我想在我的Java程序中读取c-Application的输出流。 iremoted (可在此处获得:http : _//osxbook.com/software/iremoted/download/iremoted.c_ )是一个C应用程序,如果按下了Apple Remote遥控器上的按钮,它将显示诸如“ 0x19按下”的单独行。如果我启动改头换面的程序,那么一切都会很好,每当我按下一

  • 我为学校制作了一个java程序,允许客户购买火车票。到目前为止,一切都很完美,除了当我调用final方法(当前的final方法最终会有更多)时,它会打印我命令该方法打印的内容,但它也会输出一些随机的文本行,我无法确定何时。我将粘贴下面的程序代码,并在运行程序时显示控制台。我将努力突出问题。非常感谢,希望有人能帮忙。p、 程序应在“测试”结束。 这是我运行程序时出现的错误(没有以“test”结尾,我

  • 问题内容: 我正在用一个应用程序逻辑线程和一个数据库访问线程来制作Java应用程序。他们都坚持为应用程序和都需要的整个生命周期,以在同一时间运行(一个会谈到服务器,一个谈判给用户;当应用程序完全启动,我需要两个人工作)。 但是,在启动时,我需要确保最初应用线程等待直到数据库线程准备就绪(当前是通过轮询自定义方法确定的)。我不介意应用线程在数据库线程准备就绪之前是否阻塞。 看起来不是解决方案-db线