为什么我的应用程序不释放.close()上的文件,以便可以将其删除?

时间:2019-06-18 13:15:58

标签: java resources

我的问题是,在将文本数据以XML格式导入到我的应用程序(javafx)的过程中,通过XML的字节输出流创建了一个文件,并将其存储在“ temp”文件夹中,然后刷新并关闭了它们除非关闭应用程序,否则无法删除。

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

此代码创建文件并将它们写入“ temp”文件夹位置。这是每个文件名的数组,以及一个转换为字节的文件数据字符串,用于创建文件:

        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导入/导出文件。导入时,将创建和关闭文件-并由用户决定,将其作为字节数据附加并存储在数据库中。将文件存储在数据库中之后,无论如何,应用程序都将清理(删除)存储在“ temp”文件夹中的文件。

1 个答案:

答案 0 :(得分:0)

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

实际原因是在将字节数据写入数据库并进行文件流传输期间,完成后未关闭文件流。关闭文件流(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();