java - 为什么我的应用程序没有在 .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 导入/导出的。导入时,文件被创建和关闭——并由用户自行决定,附加并作为字节数据存储在数据库中。在文件存储在数据库中之后,应用程序将清理(删除)存储在“临时”文件夹中的文件。
解决方案
我尴尬地解决了我的问题。我发布的内容实际上在上面正常工作。
实际原因是在将字节数据写入数据库和文件流传输到数据库期间,文件流在完成后没有被关闭。关闭文件流 (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();
推荐阅读
- node.js - 处理类中的回调
- sql - 如何在 SQL 中输出包含与此条件匹配的所有项目的计数的表?
- python - TypeError: __init__() 有一个意外的关键字参数“衣衫褴褛”?加载模型时
- numpy - pytorch 重复第三维
- python - 是否可以将行从 qtablewidget 转移到另一个 qtablewidget?
- c - TCP Server 多包发送问题
- ruby-on-rails - 如何在现有资源周围生成脚手架而不丢失现有代码/文件/列?
- javascript - 如何在 Firebase 上使用 module.exports 部署 nodejs 应用程序
- ipv6 - 对于具有多个等长连续零块的 IPv6 地址,应该压缩哪一个?
- javascript - 检测给定的三个单词字符串中的连字符模式