gpt4 book ai didi

Java 进程/IO 执行挂起

转载 作者:行者123 更新时间:2023-12-01 14:15:55 25 4
gpt4 key购买 nike

这是我的工作流程:

我从数据库获得工作,运行一些任务,运行一个外部程序来读取一个文件并生成另一个文件(这通常需要不到 10 秒)。这是代码:

Process p = Runtime.getRuntime().exec(prog, null, new File(path));

BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));

String s;
String errorString = "";
while((s = stdInput.readLine()) != null) {
if(s.toLowerCase().contains("error")) {
Log.writeLog("error: " + s);
errorString += s + "\r\n";
}
}

if(errorString.length() > 1) {
Emailer.email(name + "*" + errorString, "ERROR");
}

while((s = stdError.readLine()) != null) {
Log.writeLog("ERROR: " + s);
}

但是,该代码片段被挂起。我通过 LogMeIn 控制代码运行的服务器,一旦登录,进程就会解除阻塞(总运行时间约为 280 秒)并继续。该过程没有产生ERROR结果。这种情况时常发生,比我们希望的要频繁。我们在程序中进行了相当多的小型 IO 操作,并且硬盘驱动器有时会变得非常满。

知道会发生什么吗?

谢谢!

编辑:服务器只是一台连接到 LogMeIn 的普通计算机。我担心的是,由于它是一台普通计算机,因此在不使用时可能会关闭 CPU/硬盘驱动器(不确定术语是否正确)。这在一定程度上解释了为什么在我登录 LogMeIn 并有权访问计算机后它会继续。

EDIT2:直接按照流程,我运行它。而且这个挂起的时间也很长(通常是 5 秒,花了 200 多秒)。让我觉得硬盘决定小睡一下?

private void cleanup(String path) {

File srcPath = new File(path);
File[] files = srcPath.listFiles();

if(files != null) {
for(File file : files) {
if(file.isDirectory()) {
cleanup(file.getAbsolutePath());
} else {
if(file.getAbsolutePath().endsWith(".original")) {
String fileName = file.getAbsolutePath().substring(0, file.getAbsolutePath().lastIndexOf(".original"));
IO.delete(fileName);
if(!IO.renameFile(file.getAbsolutePath(), new File(fileName).getAbsolutePath())) {
Log.writeLogSevere("Failed to rename file, this could be a problem..." + fileName);
} else {
Log.writeLog("Cleaned up: " + fileName);
}
}
}
}
}
}

最佳答案

您没有耗尽错误流。你在最后才这样做,这通常可能为时已晚。进程的输出缓冲区已满,进程会阻塞等待在 stderr 输出缓冲区中获取更多空间。

您必须为此使用单独的线程,或者(更简单)使用 ProcessBuilder redirectErrorStream

关于Java 进程/IO 执行挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18105650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com