【发布时间】:2014-06-08 13:16:50
【问题描述】:
在 SEAndroid 上工作时,我从我的 Java 应用程序中调用 Setools 命令。 它与小型 SEAndroid 策略完美配合,现在我需要用真实的工具测试我的工具 SEAndroid 政策。但不幸的是,我遇到了错误流的问题。
这是我用来调用外部命令的代码:
public static BufferedReader runCommand(final String[] args)
throws IOException {
BufferedReader stdInput = null;
BufferedReader stdError = null;
try {
Process p = Runtime.getRuntime().exec(args);
stdInput = new BufferedReader(new
InputStreamReader(p.getInputStream()));
stdError = new BufferedReader(new
InputStreamReader(p.getErrorStream()));
// read any errors from the attempted command
String s = null;
StringBuilder err = new StringBuilder();
while ((s = stdError.readLine()) != null) {
err.append(s + "\n");
}
if (err.length() != 0) {
throw new IOException(err.toString());
}
return stdInput;
} finally {
if (stdError != null) {
stdError.close();
}
}
}
所以,如您所见,我调用了一个外部命令。然后读取错误流,如果有错误则抛出异常,否则我返回InputStream,以便稍后解析。
使用真正的 SEAndroid 策略,错误流似乎被阻塞(即使我读取了单个字符)并且我无法解析命令的结果。如果我在不读取任何内容的情况下关闭错误流,则应用程序可以正常工作,但我想处理任何错误。 如果我在控制台中输入命令,它也可以正常工作。
在第一种情况下(使用小型 SEAndroid 策略),命令的输出很小(约 350 行)。 在第二种情况下(使用真正的 SEAndroid 策略),命令的输出更大(>1500 行)。
输出流的大小是否会影响错误流?这两个流是两种不同的资源,不是吗? 我没有立即读取输出流这一事实很重要吗?
我担心这不是“编程”问题,而是系统问题...
有什么建议吗?
提前感谢您的帮助=)
编辑:
我尝试在错误流之前读取输出流并且它可以工作。但是我需要在对输出流进行任何解析之前检查错误流,所以问题仍然是局部的。
【问题讨论】:
标签: java stream runtime.exec