从outputstream获取内容

时间:2014-11-24 13:33:04

标签: java caching output outputstream

我使用的是一个非常古老的Java版本,我错过了很多课程。该系统在嵌入式平台上运行。有一个类来执行系统命令,但是命令的输出被丢弃。无论如何缓存或以另一种方式获得此输出?

我们与之交互的另一个java应用程序没有编码。此应用程序启动测试并在shell中输出结果。我们无法编辑该应用程序的源代码。

有什么建议吗?

4 个答案:

答案 0 :(得分:0)

如果外部应用程序将在同一进程内运行,您可以尝试在调用外部应用程序之前重定向System.out(使用System.setOut())。

答案 1 :(得分:0)

您可以检查ProcessBuilder以运行系统命令。



       ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
       Map env = pb.environment();
       env.put("VAR1", "myValue");
       env.remove("OTHERVAR");
       env.put("VAR2", env.get("VAR1") + "suffix");
       pb.directory(new File("myDir"));
       File log = new File("log");
       pb.redirectErrorStream(true);
       pb.redirectOutput(Redirect.appendTo(log));
       Process p = pb.start();

答案 2 :(得分:0)

根据您的绝望程度,您可以通过添加“垫片”类来操纵已启动流程的标准输出。基本上,使用main方法创建自己的类,该方法将stdout重定向到您想要的位置(如某些已知文件)。

public class HackMain {
  public static void main(String[] args) {
    // ... use reflection to hack System.out ...

    // invoke "real" main
    RealMainClass.main(args);
  }
}

然后将带有此类的jar添加到调用的流程命令行,并将其称为java -cp <other_jars>:<hack_jar> HackMain [<args> ...]

答案 3 :(得分:0)

如果您正在使用shell包装并且您可以访问文件系统,则可以尝试将命令的输出重定向到文件并从那里读取它:

Ish.execute(fancyCommand + " > myfile.tmp");
InputStream is = null;
    StringBuilder sb = new StringBuilder();
    try {
        is = new BufferedInputStream(new FileInputStream("/path/to/myfile.tmp"));
        int c;
        while ((c = is.read()) != -1){
            sb.append((char)c);
        }
    } catch (IOException ioex) {
        ioex.printStackTrace();
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (Exception ignore) {
            }
        }
    }