我使用的是一个非常古老的Java版本,我错过了很多课程。该系统在嵌入式平台上运行。有一个类来执行系统命令,但是命令的输出被丢弃。无论如何缓存或以另一种方式获得此输出?
我们与之交互的另一个java应用程序没有编码。此应用程序启动测试并在shell中输出结果。我们无法编辑该应用程序的源代码。
有什么建议吗?
答案 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) {
}
}
}