为什么即使文件已关闭,Java 也不会删除我的文件?

问题描述

我知道这个问题已经在这个网站上被问过和回答过很多次了。基本的解决方案是: (1) 确保文件关闭。 (2) 确保程序有绝对路径

就 (1) 而言,我将项目从 OneDrive 文件夹中取出(通常会尝试将其同步到云),并确保关闭读取文件的扫描仪。依然没有。 对于(2),该文件与项目位于同一目录中。此外,我使用了 getAbsoluteFile() 方法并将其分配给我的 file 变量。 (我也试过了,还是不行)。

我在 Windows 上操作。

File file = new File(newFile);
        Scanner printer = new Scanner(file);
        while (printer.hasNextLine()) {
            String line = printer.nextLine();
            System.out.println(line);
        }
        printer.close();
        try {
            boolean deleted = file.delete();
            if (deleted)
                System.out.println("The file has been successfully deleted.");
            else
                System.out.println("The file has not been deleted.");
        } catch (Exception e) {
                System.out.println(e.getMessage());
        }

输出文件没有被删除

解决方法

考虑在 try 结构中插入 while 循环

import java.io.File;
import java.io.FileNotFoundException;
import java.text.ParseException;
import java.util.Scanner;

public class Program {

    public static void main(String[] args) throws ParseException,FileNotFoundException {
        
        File file = new File("newFile.txt");
        Scanner printer=null;
        
        try {
            printer = new Scanner(file);
            while (printer.hasNextLine()) {
                String line = printer.nextLine();
                System.out.println(line);
            }
            printer.close();
            boolean deleted = file.delete();
            if (deleted)
                System.out.println("The file has been successfully deleted.");
            else
                System.out.println("The file has not been deleted.");
        }
        catch (Exception e) {
                System.out.println(e.getMessage());
        }
        
        finally {
        }
        
    }
}
,

Files / NIO 调用通常会提供比 File / IO 更好的错误消息 - 包括无法删除文件的原因,因此尝试将 file.delete() 替换为:

Files.delete(file.toPath());

如果您看到文件仅在 VM 退出或无法删除时删除,则可能的原因是您的代码未正确清除资源。因为您没有将 try() 与资源一起使用,所以您的文件处理的另一部分(或文件流)可能会出错,该部分未能进行适当的清理并阻止了此次删除。