为什么在捕获 ProcessBuilder 的输出时 inputStream 随机变空?

问题描述 投票:0回答:0

我在这里发现了类似的问题,但没有解决方案对我有用。

我的密码是

ResultSet rs = stmt.executeQuery();
int ret = 0;
while (rs.next()) {
    int rsID = rs.getInt("ID");
    String rsGID = rs.getString("GID");
    logger.log(Level.INFO, "");
    logger.log(Level.INFO, "ID / GID: {0}", rsID + " / " + rsGID);
    ProcessBuilder builder = new ProcessBuilder(new String[] { "bash", "-c", "grep " + rsGID + " /media/newdrive/*"});
    Process proc = builder.redirectErrorStream(true).start();
    //while (proc.isAlive());
    String smatch = StringEscapeUtils.unescapeXml(new String(proc.getInputStream().readAllBytes(), StandardCharsets.UTF_8)).replaceAll("\\R", "");
    ret = proc.waitFor();
    String sURL = StringUtils.substringBefore(StringUtils.substringAfter(smatch, "<loc>"), "</loc>");
    String sField = StringUtils.substringAfterLast(StringUtils.substringBefore(smatch, "."), "/").replaceAll("[0-9_]", "");
    logger.log(Level.INFO, "URL: {0}", rsID + " / " + sURL);
    logger.log(Level.INFO, "Field: {0}", rsID + " / " + sField);
    proc.destroy();
}
rs.close();

第一对结果随机得到一个空结果:

我的解决方法 是在 while 循环中调用 isAlive 方法。所以,在我的代码中,当我取消注释并注释 waitFor 行时,我总是得到第一对结果。

我在滥用 waitFor 吗?看起来很多开发人员都面临同样的问题。

指导将不胜感激。

顺便说一句,由于性能问题,我选择使用本机 grep。我们有 100 多个 XML 文件,每个文件约 200,000 行和 1000 多个 GID 定期匹配。

java linux grep processbuilder
© www.soinside.com 2019 - 2024. All rights reserved.