Java无法删除文件,因为它是用Java SE二进制文件打开的

Java无法删除文件,因为它是用Java SE二进制文件打开的,java,file,Java,File,我已经看了很多主题,其中人们有相同的问题,但我找不到一个明确的解决办法,如何解决这个问题 我有一个users.txt文件,我想在其中检查某个用户是否在列表中。如果用户在列表中,我想将其从列表中删除 这是通过将users.txt文件的所有内容复制到临时文件(包含给定用户的行除外)来完成的。然后删除users.txt文件,并将临时文件重命名为users.txt 我一直得到一个错误,文件无法删除,因为它是用JavaSE二进制文件打开的。任何关于如何解决此问题的建议都将不胜感激 在这里,我调用该方法:

我已经看了很多主题,其中人们有相同的问题,但我找不到一个明确的解决办法,如何解决这个问题

我有一个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
    方法中,打开和关闭文件的代码可能存在漏洞。应在
    finally
    块中关闭资源句柄(如读卡器、写卡器等),或使用“try with resources”进行管理

  • 每写一行后冲洗都是浪费

我会像这样重写整个故事:

 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中的所有内容都是某种类型的,为什么不在不创建临时文件的情况下覆盖第一个文件?让它工作起来,感谢您的明确解释!