在JVM正常退出后,Files.createTempDirectory是否删除目录?
在JVM正常退出后, Files.createTempDirectory
是否删除目录? 或者我是否需要手动递归删除临时目录内容?
根据API ,不是没有,您需要使用file.deleteOnExit()
方法手动删除目录。
与createTempFile方法一样,此方法只是临时文件工具的一部分。 可以使用shutdown-hook或File.deleteOnExit()机制自动删除目录。
在系统退出时,不会删除由Files.createTempDirectory()
创建的临时目录,除非您将它们配置为执行此操作:
可以使用shutdown-hook或
File.deleteOnExit()
机制自动删除目录。
意思是你可以打电话:
Path tmp = Files.createTempDirectory(null); tmp.toFile().deleteOnExit();
但是,您不能删除目录,除非它是空的,作为File.delete()
文档:
删除此抽象路径名表示的文件或目录。 如果此路径名表示目录,则该目录必须为空才能被删除。
因此,如果您希望删除目录及其内容,我们需要更有趣。 您可以递归注册目录及其子项进行删除,如下所示:
public static void recursiveDeleteOnExit(Path path) throws IOException { Files.walkFileTree(path, new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path file, @SuppressWarnings("unused") BasicFileAttributes attrs) { file.toFile().deleteOnExit(); return FileVisitResult.CONTINUE; } @Override public FileVisitResult preVisitDirectory(Path dir, @SuppressWarnings("unused") BasicFileAttributes attrs) { dir.toFile().deleteOnExit(); return FileVisitResult.CONTINUE; } }); }
但请注意,这会将所有当前存在的文件注册为删除 – 如果在调用此方法后创建新文件,则不会根据File.delete()
的记录行为删除它们及其父目录。
如果要在退出时删除目录,无论所述目录的内容如何,都可以以几乎相同的方式使用shutdown-hook:
public static void recursiveDeleteOnShutdownHook(final Path path) { Runtime.getRuntime().addShutdownHook(new Thread( new Runnable() { @Override public void run() { try { Files.walkFileTree(path, new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path file, @SuppressWarnings("unused") BasicFileAttributes attrs) throws IOException { Files.delete(file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException e) throws IOException { if (e == null) { Files.delete(dir); return FileVisitResult.CONTINUE; } // directory iteration failed throw e; } }); } catch (IOException e) { throw new RuntimeException("Failed to delete "+path, e); } }})); }
但请注意,每次调用它都会重复注册一个新的关闭线程,这可能会导致大规模问题。 File.deleteOnExit()
存储一组已注册的文件,并在一个关闭钩子中删除所有这些文件。 如果您需要以这种方式删除许多目录,您需要实现类似的东西。
您可以将apache commons io依赖项添加到项目中,然后使用FileUtils.deleteDirectory()执行以下操作:
Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { try { FileUtils.deleteDirectory(tmp_dir_path.toFile()); } catch (IOException ex) { ex.printStackTrace(); } } });
有关apache commons的更多信息,请访问: https : //commons.apache.org/proper/commons-io/
不,它没有 – createTempDirectory
与
createTempFile
方法一样,此方法只是临时文件工具的一部分。 可以使用shutdown-hook或File.deleteOnExit()
机制自动删除目录。
不,它没有。 你必须自己做。 或者使用java.io.File.deleteOnExit()
但我猜它不适用于非空目录