Java无法删除文件,因为它是用Java SE二进制文件打开的
我已经看了很多主题,其中人们有相同的问题,但我找不到一个明确的解决办法,如何解决这个问题 我有一个users.txt文件,我想在其中检查某个用户是否在列表中。如果用户在列表中,我想将其从列表中删除 这是通过将users.txt文件的所有内容复制到临时文件(包含给定用户的行除外)来完成的。然后删除users.txt文件,并将临时文件重命名为users.txt 我一直得到一个错误,文件无法删除,因为它是用JavaSE二进制文件打开的。任何关于如何解决此问题的建议都将不胜感激 在这里,我调用该方法:Java无法删除文件,因为它是用Java SE二进制文件打开的,java,file,Java,File,我已经看了很多主题,其中人们有相同的问题,但我找不到一个明确的解决办法,如何解决这个问题 我有一个users.txt文件,我想在其中检查某个用户是否在列表中。如果用户在列表中,我想将其从列表中删除 这是通过将users.txt文件的所有内容复制到临时文件(包含给定用户的行除外)来完成的。然后删除users.txt文件,并将临时文件重命名为users.txt 我一直得到一个错误,文件无法删除,因为它是用JavaSE二进制文件打开的。任何关于如何解决此问题的建议都将不胜感激 在这里,我调用该方法:
BufferedReader br = new BufferedReader(new FileReader("C:/Users/Leroy/Documents/users.txt"));
String registerUser;
while ((registerUser = br.readLine()) != null) {
if (registerUser.contains(removeuser)){
removeLineFromFile("C:/Users/Leroy/Documents/users.txt", registerUser);
}
}
方法:
public void removeLineFromFile(String file, String lineToRemove) {
try {
File inFile = new File(file);
if (!inFile.isFile()) {
System.out.println("Parameter is not an existing file");
return;
}
//Construct the new file that will later be renamed to the original filename.
File tempFile = new File(inFile.getAbsolutePath()+ ".tmp");
BufferedReader br = new BufferedReader(new FileReader(file));
PrintWriter pw = new PrintWriter(new FileWriter(tempFile));
String line = null;
//Read from the original file and write to the new
//unless content matches data to be removed.
while ((line = br.readLine()) != null) {
if (!line.trim().equals(lineToRemove)) {
pw.println(line);
pw.flush();
}
}
pw.close();
br.close();
//Delete the original file
if (!inFile.delete()) {
System.out.println("Could not delete file");
return;
}
//Rename the new file to the filename the original file had.
if (!tempFile.renameTo(inFile))
System.out.println("Could not rename file");
}
在调用
“users.txt”
文件上的removeLineFromFile
之前,您为它打开了另一个读卡器。该读卡器仍处于打开状态,这就是删除失败的原因
实际上,您的代码中还有其他缺陷:
- 调用上下文中的
循环在读取文件的同时重复重写文件。考虑到您正在使用缓冲读取器进行读取,由于重写器的活动,循环可能会看到部分行while
- 在
方法中,打开和关闭文件的代码可能存在漏洞。应在removeLineFromFile
块中关闭资源句柄(如读卡器、写卡器等),或使用“try with resources”进行管理finally
- 每写一行后冲洗都是浪费
File tempFile = new File(file.getAbsolutePath()+ ".tmp");
try (BufferedReader br = new BufferedReader(new FileReader(inFile));
PrintWriter pw = new PrintWriter(new FileWriter(tempFile))) {
String registerUser;
while ((registerUser = br.readLine()) != null) {
if (!registerUser.contains(removeuser)) {
pw.println(line);
}
}
}
if (!inFile.delete()) {
System.out.println("Could not delete file");
} else if (!tempFile.renameTo(inFile))
System.out.println("Could not rename file");
}
(如果要避免在没有匹配行的情况下“触摸”输入文件,则可以在找到并删除行时设置标志…等等。)要删除的文件上打开了两个缓冲读卡器,是否在删除文件之前尝试关闭上述读卡器?将文件删除逻辑移到removeLineFromFile()之外方法。首先关闭bufferedreader,然后尝试删除它。如果arraylist中的所有内容都是某种类型的,为什么不在不创建临时文件的情况下覆盖第一个文件?让它工作起来,感谢您的明确解释!