Java无法删除文件,因为它是在Java SE BINARY中打开的

时间:2015-04-14 10:19:43

标签: java file

我已经看过人们遇到同样问题的多个主题,但是我找不到如何解决这个问题的明确解决方案。

我有一个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");
    }

1 个答案:

答案 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");
 }

(如果你想避免“触摸”输入文件,如果没有匹配的行,那么你可以设置一个标志,如果你找到并删除了一行......等等。)