即使流关闭,执行删除时正在使用的文件

时间:2017-07-13 06:45:43

标签: java jsf

我尝试删除目录中的文件,但在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());
                }
            }
        }

读取并关闭流后,我尝试删除我的图像文件。 但它告诉我错误说,由于资源正在使用,无法删除图像文件。 请帮忙。 感谢

1 个答案:

答案 0 :(得分:1)

public void checkImage(String attachment)方法中,您可以执行以下操作:

  1. 您从新的FileInputStream
  2. 中创建了新的File
  3. 然后你完全忘记它曾经存在过。
  4. 然后,您从新FileInputStream创建 全新 File,然后将其传递给new DefaultStreamedContent()以创建您的图片。
  5. 然后,稍后,您只关闭该图像的输入流。

    您创建的第一个FileInputStream只会在收集垃圾时关闭,并且无法保证何时 发生。

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