java - 为什么我的应用程序不在 .close() 上释放文件以便删除它们?

标签 java resources

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

这是一个相当简单的删除代码。我在创建后执行 .flush() 和 .close() 文件。它们没有打开,只是简单地创建。应用程序导航到“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 导入/导出的。在导入时,文件被创建和关闭——由用户自行决定,作为字节数据附加和存储在数据库中。文件存储在数据库中后,应用程序将无论如何清理(删除)存储在“临时”文件夹中的文件。

最佳答案

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

真正的原因是在字节数据写入数据库和File Streaming的过程中,File Stream在完成后没有被关闭。关闭文件流 (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();

关于java - 为什么我的应用程序不在 .close() 上释放文件以便删除它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56650071/

相关文章:

java - 为什么java编译器不重写这段代码?

java - 从 MySQL 数据库插入到 mdb

Android 布局错误 : "Resource id <res_id> is not of type STYLE (instead attr)"

javascript - Web 应用程序的文本到语音转换

java - 从最大到最小合并

JavaFx 场景生成器 ImageView 质量

wpf - WPF-图片 'is not part of the project or its Build Action is not set to Resource'

java - 如何从 Java JAR 文件中获取资源/文件的路径

hadoop - 作业在子队列中提交,但不在父队列中提交

ios - 使用引用计数计算目录中的文件数