使用Java处理临时文件/文件夹 | 您所在的位置:网站首页 › win7如何清理临时文件夹内存 › 使用Java处理临时文件/文件夹 |
Java NIO.2 API提供了对使用临时文件夹/文件的支持。 例如,我们可以轻松地找到临时文件夹/文件的默认位置,如下所示: 1String defaultBaseDir = System.getProperty("java.io.tmpdir");通常,在Windows中,默认的临时文件夹为C:\TEMP,%Windows%\TEMP或Local Settings\TEMP中每个用户的临时目录(此位置通常通过TEMP环境变量控制)。 在Linux / Unix中,全局临时目录为/tmp和/var/tmp。 前一行代码将返回默认位置,具体取决于操作系统。 接下来,我们将学习如何创建一个临时文件夹/文件。 创建一个临时文件夹/文件 创建临时文件夹可以使用以下方法完成: Path createTempDirectory (Path dir, String prefix, FileAttribute< ? >... attrs) 这是Files类中的static方法,可以按如下方式使用: 让我们在操作系统的默认位置创建一个没有前缀的临时文件夹: 12// C:\Users\Anghel\AppData\Local\TEMP\8083202661590940905 Path tmpNoPrefix = Files.createTEMPDirectory(null);让我们在操作系统的默认位置创建一个带有自定义前缀的临时文件夹: 123// C:\Users\Anghel\AppData\Local\TEMP\logs_5825861687219258744 String customDirPrefix ="logs_"; Path tmpCustomPrefix = Files.createTEMPDirectory(customDirPrefix);让我们在带有自定义前缀的自定义位置中创建一个临时文件夹: 1234// D:\tmp\logs_10153083118282372419 Path customBaseDir = Filesystems.getDefault().getPath("D:/tmp"); String customDirPrefix ="logs_"; Path tmpCustomLocationAndPrefix = Files.createTEMPDirectory(customBaseDir, customDirPrefix);创建临时文件可以通过以下方式完成: Path createTempFile (Path dir, String prefix, String suffix, FileAttribute< ? >... attrs 这是Files类中的static方法,可以按如下方式使用: 让我们在操作系统的默认位置创建一个没有前缀和后缀的临时文件: 12// C:\Users\Anghel\AppData\Local\TEMP\16106384687161465188.tmp Path tmpNoPrefixSuffix = Files.createTEMPFile(null, null);让我们在操作系统的默认位置创建一个带有自定义前缀和后缀的临时文件: 1234// C:\Users\Anghel\AppData\Local\TEMP\log_402507375350226.txt String customFilePrefix ="log_"; String customFilesuffix =".txt"; Path tmpCustomPrefixAndSuffix = Files.createTEMPFile(customFilePrefix, customFilesuffix);让我们在带有自定义前缀和后缀的自定义位置中创建一个临时文件: 123456// D:\tmp\log_13299365648984256372.txt Path customBaseDir = Filesystems.getDefault().getPath("D:/tmp"); String customFilePrefix ="log_"; String customFilesuffix =".txt"; Path tmpCustomLocationPrefixSuffix = Files.createTEMPFile(customBaseDir, customFilePrefix, customFilesuffix);接下来,我们将研究删除临时文件夹/文件的不同方法。 通过关机挂钩删除临时文件夹/文件 删除临时文件夹/文件是可以由操作系统或专用工具完成的任务。 但是,有时,我们需要以编程方式进行控制,并根据不同的设计考虑删除文件夹/文件。 该问题的解决方案依赖于关闭挂钩机制,可以通过Runtime.getRuntime().addShutdownHook()方法实现该机制。 每当我们需要在JVM关闭之前立即完成某些任务(例如,清理任务)时,此机制就很有用。 它作为Java线程实现,当JVM在关闭时执行shutdown-hook时,将调用run()方法。 如下代码所示: 12345678910111213141516171819202122232425262728293031Path customBaseDir = Filesystems.getDefault().getPath("D:/tmp"); String customDirPrefix ="logs_"; String customFilePrefix ="log_"; String customFilesuffix =".txt"; try { Path tmpDir = Files.createTEMPDirectory(customBaseDir, customDirPrefix); Path tmpFile1 = Files.createTEMPFile(tmpDir, customFilePrefix, customFilesuffix); Path tmpFile2 = Files.createTEMPFile(tmpDir, customFilePrefix, customFilesuffix); Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { try (DirectoryStream ds = Files.newDirectoryStream(tmpDir)) { for (Path file: ds) { Files.delete(file); } Files.delete(tmpDir); } catch (IOException e) { ... } } }); //simulate some operations with TEMP file until delete it Thread.sleep(10000); } catch (IOException | InterruptedException e) { ... }在异常/强制终止的情况下(例如,JVM崩溃,触发了Terminal操作等),将不执行shutdown-hook。 它在所有线程完成或调用System.exit(0)时运行。 建议快速运行它,因为如果出现问题(例如,操作系统关闭),可以在完成之前将它们强行停止。 以编程方式,关闭挂钩只能由Runtime.halt()停止。 通过deleteOnExit()删除临时文件夹/文件 删除临时文件夹/文件的另一种解决方案依赖于File.deleteOnExit()方法。 通过调用此方法,我们可以注册删除文件夹/文件。 JVM关闭时,将执行删除操作: 1234567891011121314151617181920212223242526Path customBaseDir = Filesystems.getDefault().getPath("D:/tmp"); String customDirPrefix ="logs_"; String customFilePrefix ="log_"; String customFilesuffix =".txt"; try { Path tmpDir = Files.createTEMPDirectory(customBaseDir, customDirPrefix); System.out.println("Created TEMP folder as:" + tmpDir); Path tmpFile1 = Files.createTEMPFile(tmpDir, customFilePrefix, customFilesuffix); Path tmpFile2 = Files.createTEMPFile(tmpDir, customFilePrefix, customFilesuffix); try (DirectoryStream ds = Files.newDirectoryStream(tmpDir)) { tmpDir.toFile().deleteOnExit(); for (Path file: ds) { file.toFile().deleteOnExit(); } } catch (IOException e) { ... } // simulate some operations with TEMP file until delete it Thread.sleep(10000); } catch (IOException | InterruptedException e) { ... }建议仅在应用程序管理少量临时文件夹/文件时才依靠此方法(deleteOnExit())。 此方法可能会消耗大量内存(它为注册用于删除的每个临时资源消耗内存),并且直到JVM终止,才可能释放该内存。 请注意,由于需要调用此方法来注册每个临时资源,并且删除是以相反的注册顺序进行的(例如,在注册其内容之前,我们必须注册一个临时文件夹)。 通过DELETE_ON_CLOSE删除临时文件 关于删除临时文件的另一种解决方案依赖于StandardOpenOption.DELETE_ON_CLOSE(在关闭流时删除该文件)。 例如,以下代码段通过createTempFile()方法创建一个临时文件,并使用明确指定的DELETE_ON_CLOSE打开该文件的缓冲写入器流: 1234567891011121314151617181920Path customBaseDir = Filesystems.getDefault().getPath("D:/tmp"); String customFilePrefix ="log_"; String customFilesuffix =".txt"; Path tmpFile = null; try { tmpFile = Files.createTEMPFile( customBaseDir, customFilePrefix, customFilesuffix); } catch (IOException e) { ... } try (BufferedWriter bw = Files.newBufferedWriter(tmpFile, StandardCharsets.UTF_8, StandardOpenOption.DELETE_ON_CLOSE)) { //simulate some operations with TEMP file until delete it Thread.sleep(10000); } catch (IOException | InterruptedException e) { ... }此解决方案可用于任何文件。 它不特定于临时资源。 完整示例可在GitHub上找到,前缀为 P142_foo 。 如果您喜欢本文,那么您会喜欢我的书《 Java编码问题》,其中有专门的章节,其中包括20个专门针对Java I / O的问题。 编码愉快! 进一步阅读 在日期和时间之间转换的实用指南 清理您的临时文件! |
CopyRight 2018-2019 实验室设备网 版权所有 |