我的问题是,在将文本数据以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”文件夹中的文件。
答案 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();