我已经看过人们遇到同样问题的多个主题,但是我找不到如何解决这个问题的明确解决方案。
我有一个users.txt文件,我想检查某个用户是否在列表中。如果用户在列表中,我想从列表中删除他。
这是通过将users.txt文件的所有内容复制到临时文件来完成的,除了包含给定用户的行。然后删除users.txt文件并将临时文件重命名为users.txt。
我一直收到无法删除文件的错误,因为它是在Java SE BINARY中打开的。任何有关如何解决这个问题的建议都将非常感谢!
我称之为方法:
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");
}
答案 0 :(得分:1)
在removeLineFromFile
文件上调用"users.txt"
之前,您打开了另一个阅读器。该阅读器仍处于打开状态, 是删除失败的原因。
实际上,您的代码还存在其他缺陷:
调用上下文中的while
循环在读取文件的同时重复重写文件。考虑到您使用缓冲读取器进行读取,由于重写器的活动,循环有机会看到部分行。
在removeLineFromFile
方法中,您打开和关闭文件的代码可能会泄漏。资源句柄(例如读者,作家等)应在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");
}
(如果你想避免“触摸”输入文件,如果没有匹配的行,那么你可以设置一个标志,如果你找到并删除了一行......等等。)