我在这里发现了类似的问题,但没有解决方案对我有用。
我的密码是
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 定期匹配。