我在Mac上编写了代码。 我正在创建两个文件,让我们称之为file1和file2 对于file1,如果我在SQL中找到一个比存储在file1中的记录更大的记录,我将所有内容写入临时文件,删除file1并将临时文件重命名为file1。这适用于Windows和Mac。
对于file2,如果我在SQL中找到一个比存储在file2中的更大的时间戳值,我会做同样的过程。这在我的Mac环境中本地工作,但无法在Windows上删除和重命名该文件。
然而,当我第一次启动程序时,由于我的缓冲编写器总是写入临时文件然后重命名临时文件,因此第一次运行程序时,文件2的重命名和删除是有效的,这意味着文件2,而不是file1尚未存在。
因此,启动时,file2不存在。缓冲的写入器写入tempFile,如果存在则删除file2(在这种情况下不存在),并将tempFile重命名为file2。这有效。但是,后续记录新数据无法删除并重命名file2。但正如我所说,这适用于Mac但不适用于Windows。
删除和重命名file1的代码(适用于Windows和Mac):
private void recordMaxRecordIdFromHistory(String table, String maxRecord) {
String line;
try {
File file1 = new File(file1);
File tempFile = new File("tempFile.txt");
FileWriter fw = new FileWriter(tempFile, false);
BufferedWriter bw = new BufferedWriter(fw);
if (!file1.exists()) {
file1.createNewFile();
}
FileReader fr = new FileReader(file1);
BufferedReader br = new BufferedReader(fr);
//writing to temp file
if(){
....
}
else{
....
}
bw.close();
br.close();
if (file1.delete()) {
logger.info("Successfully deleted the max ID file");
} else {
logger.error("Unable to delete the file maxID File");
}
if (tempFile.renameTo(file1)) {
logger.info("Successfully renamed the tempFile to file1");
} else {
logger.error("Unable to rename the tempFile to file1");
}
} catch (Exception ex) {
logger.error(ex.getMessage());
}
}
删除和重命名File2的代码(适用于Mac,仅适用于第一次在Windows上运行程序)
private void recordLastModifiedDate(String table, Timestamp modifiedDate) {
String line;
try {
File file2 = new File(file2);
File tempFile2 = new File("tempFile2.txt");
FileWriter fw = new FileWriter(tempFile2, false);
BufferedWriter bw = new BufferedWriter(fw);
if (!file2.exists()) {
file2.createNewFile();
}
FileReader fr = new FileReader(file2);
BufferedReader br = new BufferedReader(fr);
//WRITING TO FILE HERE
bw.close();
br.close();
if (file2.delete()) {
logger.info("Successfully deleted the lastModified file");
} else {
logger.error("Unable to delete the lastModified file");
}
if (tempFile2.renameTo(file2)) {
logger.info("Successfully renamed the tempFile to lastModified");
} else {
logger.error("Unable to rename the tempFile to lastModified");
}
} catch (Exception ex) {
logger.error(ex.getMessage());
}
}
答案 0 :(得分:1)
您没有关闭FileReader
,而是关闭BufferedReader
(作家也是如此)。
由于您未关闭FileReader/FileWriter
(fr.close()
和fw.close()
),因此句柄保持有效。
这在类似Unix的系统(如MacOS-X)上不是问题,但在Windows中,如果程序上已经有一个打开的句柄(读取或写入),则无法删除文件(Windows locks 文件),因此错误。
请致电fr.close()
和fw.close()
,您的代码将在Windows上运行。