File.delete() & File.renameTo() 在项目环境中不工作

File.delete() & File.renameTo() Not Working in Project Environment

我正在尝试创建一种身份验证系统,它使用名为 Users.dat 的文件来存储用户数据。目前,我正在开发一种通过 重写 Users.dat 文件删除用户的方法,省略指定的用户。下面的代码在一个包含 .java 文件和 Users.dat 文件的包罗万象的目录的基本环境中工作。旧的Users.dat文件被删除,Users.dat.tmp重命名为User.dat。 (这里没问题,一切正常)。

public static boolean RemoveUser(String userName) {
        // TODO remove username from Users.dat
        try {

            File originalFile = new File("Users.dat");
            System.out.println(originalFile.getAbsolutePath());

            BufferedReader read = new BufferedReader(new FileReader("Users.dat"));

            String line = null;
            while ((line = read.readLine()) != null) {
                if (line.indexOf(userName) != -1) {
                    break;
                }
            }
            String[] userInfo = line.split(", ");
            if (!userName.equals(userInfo[2])) {
                System.out.println("Username not found. No users removed.");
                read.close();
                return false;
            }
            File tempFile = new File(originalFile.getAbsolutePath() + ".tmp");
            PrintWriter print = new PrintWriter(new FileWriter(tempFile));
            String lineToRemove = line;

            BufferedReader read2 = new BufferedReader(new FileReader("Users.dat"));
            while ((line = read2.readLine()) != null) {

                if (!line.trim().equals(lineToRemove)) {
                    print.println(line);
                    print.flush();
                }
            }
            print.close();
            read.close();
            read2.close();
            System.out.println(originalFile.getAbsolutePath());
            originalFile.delete(); //This line is not executing correctly
            tempFile.renameTo(originalFile); //Nor is this line

        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        return true;
    }

Users.dat 文件格式:

Joe, Last, jlast, 58c536ed8facc2c2a293a18a48e3e120, true
Sam, sone, samsone, 2c2a293a18a48e3e12058c536ed8facc, false
Jane, Best, jbest, 293a18a48e3e12052058c536ed8facc2c, false
Andrew, Estes, Aestes, 63a490d69aa544fd1272a976014ad570, true
Test, User, tuser, 63a490d69aa544fd1272a976014ad570, true

我有两个 System.out.println(originalFile.getAbsolutePath()) 语句,一个在开头,一个在结尾,以确保路径不会在所有过程中以某种方式搞砸.

正如我所说,代码有效,但是,当我尝试在我的项目中实现它时,它会创建 Users.dat.tmp 并写入正确的数据,但它不会删除旧的 Users.dat 文件,也不会重命名 Users.dat.tmp文件替换 Users.dat。我确定该目录是正确的,因为我在代码执行时确实显示了它。我想不出 originalFile.delete() 和 tempFile.renameTo(originalFile) 无法正常运行的任何其他原因。

编辑: 使用 java.nio.file,我能够生成一条错误消息。它显示:

java.nio.file.FileSystemException: C:\Path\Users.dat: The process cannot access the file because it is being used by another process.

显示此错误消息时我没有打开文件,并且在开头提到的测试环境中使用 java.nio 也没有收到此错误。我不确定该消息指的是哪个其他进程。

编辑 2: 我在其他机器上尝试了 运行 代码,一台是 Mac,另一台是 Windows 笔记本电脑,代码在 Mac 上运行得很好,但我仍然看到在 Windows 笔记本电脑上也有同样的问题。

我在 main 中调用了一个较早的函数,该函数正在访问 Users.dat,但我从未在该函数中关闭 BufferredReader。

我遇到了类似的问题。我的问题是没有关闭我读取和写入文件的所有流。感谢您的编辑#1,这很有帮助 当你包裹 BufferedReader read = new BufferedReader(new FileReader("Users.dat")); 你不需要关闭内部读者吗? 如果不是为了作者,而是为了那些偶然发现这个问题的人(比如我),希望这个建议有用