首页 > 解决方案 > 为什么我的应用程序没有在 .close() 上发布文件以便可以删除它们?

问题描述

我的问题是,在将文本数据 XML 导入我的应用程序(javafx)期间,通过 XML 中字节的 OutputStream 创建文件,存储在“临时”文件夹中,刷新并关闭,但无法删除它们除非申请已关闭。

这是一个相当简单的删除代码。我在创建后执行 .flush() 和 .close() 文件。它们没有打开,只是简单地创建。应用程序导航到“临时”文件夹并删除其中的所有文件。删除代码在独立测试中有效,但在应用程序运行时无效。我认为删除代码很好,问题是要释放文件。我研究过我正在正确创建和关闭文件,并且删除代码似乎很简单。所以我不确定为什么它们仍然没有被删除。

此代码创建文件并将它们写入“临时”文件夹位置。这是每个文件名的数组和转换为创建文件的字节的文件数据字符串:

        String[] ary = f.split("\\*", 2);
        OutputStream os = null;
        try {
            String filePath = GlobalVariables.TEMP + ary[0];
            byte[] bytes = ary[1].getBytes();
            os = new FileOutputStream(new File(filePath));
            os.write(Base64.getDecoder().decode(bytes));
            os.flush();
            os.close();
            files.add(new NoteFile(ary[0], filePath));
        } catch(IOException io) {
            io.printStackTrace();
        } finally {
            try {
                if(os != null) os.close();
                System.gc();
            } catch(IOException io){
                LoggerWrapper.getInstance().myLogger.fine("ResearchController.loadImportedDataToDB cannot release files");
            }
        }

如果 XML 中包含文件,则此代码“尝试”在清理期间删除“temp”文件夹中包含的文件。

if(n.containsKey("File")){
    File file = new File(GlobalVariables.TEMP);
    String[] myFiles;
    if(file.isDirectory()){
        myFiles = file.list();
        for (String s : myFiles) {
            File myFile = new File(file, s);
            myFile.delete();
        }
    }
}

目的是能够在此应用程序的用户之间共享信息和文件。因此,文件是使用 Base64 通过 XML 导入/导出的。导入时,文件被创建和关闭——并由用户自行决定,附加并作为字节数据存储在数据库中。在文件存储在数据库中之后,应用程序将清理(删除)存储在“临时”文件夹中的文件。

标签: javaresources

解决方案


我尴尬地解决了我的问题。我发布的内容实际上在上面正常工作。

实际原因是在将字节数据写入数据库和文件流传输到数据库期间,文件流在完成后没有被关闭。关闭文件流 (fis) 后,问题得到解决。

ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
for(int readNum; (readNum=fis.read(buf))!=-1;)
     bos.write(buf,0,readNum);
fis.close();                  // This was the missing code which corrected my issue.
return bos.toByteArray();

推荐阅读