gpt4 book ai didi

java - IOUtils.copy 是否会阻塞直到写入完成?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:51:50 25 4
gpt4 key购买 nike

这是我的情况:我正在使用 IOUtils 复制文件。接下来我要做的是向另一个程序发送一条 JSON 消息,表示“您可以下载副本”。问题是大约 25% 的时间其他程序收到错误消息“收到意外的 EOF 下载工件”。

每次出现这个错误,如果我手动重试,错误就不会出现。我的理论是 IOUtils.copy 不会阻塞,操作系统仍在将文件写入 FS,而其他程序会尝试下载它。有没有办法强制 IOUtils.copy 或其他功能等效的代码阻塞,直到操作系统完成文件写入?还是我的理论不正确?这是我正在使用的代码:

private boolean archiveArtifact(String archivePath, String deployId, Artifact artifact) {
InputStream inputStream = null;
FileOutputStream fileOutputStream = null;
boolean successful = true;

try {
File archiveDir = new File(archivePath);
File deployDir = new File(archiveDir, deployId);

if (!deployDir.exists()) {
deployDir.mkdirs();
}

URLConnection connection = new URL(artifact.getJenkinsUrl()).openConnection();
inputStream = connection.getInputStream();
File output = new File(deployDir, artifact.getFileName());
fileOutputStream = new FileOutputStream(output);
IOUtils.copy(inputStream, fileOutputStream);
} catch (IOException e) {
successful = false;
logger.error(e.getMessage(), e);
} finally {
try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
successful = false;
logger.error(e.getMessage(), e);
}

try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
successful = false;
logger.error(e.getMessage(), e);
}
}

return successful;
}

可能值得注意的是,我正在将其复制到 NFS。请记住,我对 NFS 真的一无所知。这是 CentOS 5.9 版(最终版)。

最佳答案

您当前的代码仅确保将文件内容传递给操作系统进行写入;它不保证它实际写入磁盘。

要确定文件实际上已写入磁盘,您可以在 FileDescriptor 上调用 sync():

fileOutputStream.flush();
fileOutputStream.getFD().sync();

关于java - IOUtils.copy 是否会阻塞直到写入完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17459528/

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