gpt4 book ai didi

java - 即使流已关闭,执行删除时文件仍在使用中

转载 作者:行者123 更新时间:2023-11-30 06:36:52 25 4
gpt4 key购买 nike

我尝试删除目录中的文件,但在 jsf 托管 bean 中失败。有人可以帮忙吗?非常感谢。

下面是我的 xhmtl 代码

#{incomingCheckList.checkImage(result.imageURL)}

<p:graphicImage value="#{incomingCheckList.image}" stream="false" styleClass="checkListImageSize"/>

#{incomingCheckList.closeStream()}

下面是我的托管 Bean 代码

private StreamedContent image;
public void checkImage(String attachment) throws IOException {


FileInputStream in = new FileInputStream(new File(attachment));

image = new DefaultStreamedContent(new FileInputStream(new File(attachment)));

}

public void closeStream() throws IOException {
try {
image.getStream().close();
System.out.println("closed");
} catch (Exception e) {
System.out.println("exception");
}

}

下面是我的删除代码

for (int i = 0; i < allCheckList.size(); i++) {
if (allCheckList.get(i).isDeleteOrNot()) {

File file = new File(fileUploadPath + "/incomingCheckList/" + allCheckList.get(i).getComponentPhoto());


try {
Files.delete(file.toPath());

} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}

在我阅读并关闭流后,我尝试删除我的图像文件。但它显示错误说无法删除图像文件,因为资源正在使用中。请帮忙。谢谢

最佳答案

在您的 public void checkImage(String Attachment) 方法中,您执行以下操作:

  1. 您从新的 File 创建一个新的 FileInputStream
  2. 然后你就会完全忘记它曾经存在过。
  3. 然后,您从新的 File 中创建一个全新的 FileInputStream,并将其传递给 new DefaultStreamedContent() 来创建您的图像。

然后,稍后,您只需关闭该图像的输入流。

您创建的第一个 FileInputStream 仅在垃圾收集时才会关闭,并且不能保证何时,甚至是否 这将会发生。

您犯此错误的事实意味着您没有收到有关未使用的局部变量 in 的警告。这又意味着您正在尝试在未启用警告的情况下进行编程。不要那样做。除非您首先启用尽可能多的警告,然后确保您的代码永远不会生成任何警告,否则您不会走得太远。

关于java - 即使流已关闭,执行删除时文件仍在使用中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45073237/

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