
Java NIO.2 API提供了對使用臨時檔案夾/檔案的支援。例如,我們可以輕松地找到臨時檔案夾/檔案的預設位置,如下所示:
Java
1
String defaultBaseDir = System.getProperty("java.io.tmpdir");
通常,在Windows中,預設的臨時檔案夾為 C:Temp , %Windows%Temp 或每個使用者所在的臨時目錄 Local SettingsTemp (此位置通常由TEMP 環境變量控制 )。
在Linux / Unix中,全局臨時目錄為 /tmp 和 /var/tmp 。前一行代碼将傳回預設位置,具體取決于作業系統。接下來,我們将學習如何建立一個臨時檔案夾/檔案。
建立一個臨時檔案夾/檔案
建立臨時檔案夾可以使用以下方法完成:
· Path createTempDirectory (Path dir, String prefix, FileAttribute<?>... attrs)
這是類中的一種 static方法 Files ,可以按如下方式使用:
· 讓我們在作業系統的預設位置建立一個沒有字首的臨時檔案夾:
Java
1
// C:UsersAnghelAppDataLocalTemp8083202661590940905
2
Path tmpNoPrefix = Files.createTempDirectory(null);
讓我們在作業系統的預設位置建立一個帶有自定義字首的臨時檔案夾:
Java
1
// C:UsersAnghelAppDataLocalTemplogs_5825861687219258744
2
String customDirPrefix = "logs_";
3
Path tmpCustomPrefix = Files.createTempDirectory(customDirPrefix);
讓我們在帶有自定義字首的自定義位置中建立一個臨時檔案夾:
Java
1
// D:tmplogs_10153083118282372419
2
Path customBaseDir = FileSystems.getDefault().getPath("D:/tmp");
3
String customDirPrefix = "logs_";
4
Path tmpCustomLocationAndPrefix = Files.createTempDirectory(customBaseDir, customDirPrefix);
建立臨時檔案可以通過以下方式完成:
· Path createTempFile (Path dir, String prefix, String suffix, FileAttribute<?>... attrs
這是類中的一種static方法Files ,可以按如下方式使用:
· 讓我們在作業系統的預設位置建立一個沒有字首和字尾的臨時檔案:
Java
1
// C:UsersAnghelAppDataLocalTemp16106384687161465188.tmp
2
Path tmpNoPrefixSuffix = Files.createTempFile(null, null);
讓我們在作業系統的預設位置建立一個帶有自定義字首和字尾的臨時檔案:
Java
1
// C:UsersAnghelAppDataLocalTemplog_402507375350226.txt
2
String customFilePrefix = "log_";
3
String customFileSuffix = ".txt";
4
Path tmpCustomPrefixAndSuffix = Files.createTempFile(customFilePrefix, customFileSuffix);
讓我們在帶有自定義字首和字尾的自定義位置中建立一個臨時檔案:
Java
1
// D:tmplog_13299365648984256372.txt
2
Path customBaseDir = FileSystems.getDefault().getPath("D:/tmp");
3
String customFilePrefix = "log_";
4
String customFileSuffix = ".txt";
5
Path tmpCustomLocationPrefixSuffix
6
= Files.createTempFile(customBaseDir, customFilePrefix, customFileSuffix);
接下來,我們将研究删除臨時檔案夾/檔案的不同方法。
通過關機挂鈎删除臨時檔案夾/檔案
删除臨時檔案夾/檔案是可以由作業系統或專用工具完成的任務。但是,有時,我們需要以程式設計方式進行控制,并基于不同的設計考慮因素删除檔案夾/檔案。
該問題的解決方案依賴于可通過該方法實作的關機挂鈎機制 Runtime.getRuntime().addShutdownHook() 。每當我們需要在JVM關閉之前立即完成某些任務(例如,清理任務)時,此機制就很有用。它作為Java線程實作,run() 當JVM在關閉時執行shutdown-hook時,将調用其 方法。如下代碼所示:
Java
1
Path customBaseDir = FileSystems.getDefault().getPath("D:/tmp");
2
String customDirPrefix = "logs_";
3
String customFilePrefix = "log_";
4
String customFileSuffix = ".txt";
5
6
try {
7
Path tmpDir = Files.createTempDirectory(customBaseDir, customDirPrefix);
8
Path tmpFile1 = Files.createTempFile(tmpDir, customFilePrefix, customFileSuffix);
9
Path tmpFile2 = Files.createTempFile(tmpDir, customFilePrefix, customFileSuffix);
10
11
Runtime.getRuntime().addShutdownHook(new Thread() {
12
13
@Override
14
public void run() {
15
try (DirectoryStream<Path> ds = Files.newDirectoryStream(tmpDir)) {
16
for (Path file: ds) {
17
Files.delete(file);
18
}
19
20
Files.delete(tmpDir);
21
} catch (IOException e) {
22
...
23
}
24
}
25
});
26
27
//simulate some operations with temp file until delete it
28
Thread.sleep(10000);
29
} catch (IOException | InterruptedException e) {
30
...
31
}
通過deleteOnExit()删除臨時檔案夾/檔案
删除臨時檔案夾/檔案的另一種解決方案依賴于該 File.deleteOnExit()方法。通過調用此方法,我們可以注冊删除檔案夾/檔案。JVM關閉時,将執行删除操作:
Java
1
Path customBaseDir = FileSystems.getDefault().getPath("D:/tmp");
2
String customDirPrefix = "logs_";
3
String customFilePrefix = "log_";
4
String customFileSuffix = ".txt";
5
6
try {
7
Path tmpDir = Files.createTempDirectory(customBaseDir, customDirPrefix);
8
System.out.println("Created temp folder as: " + tmpDir);
9
Path tmpFile1 = Files.createTempFile(tmpDir, customFilePrefix, customFileSuffix);
10
Path tmpFile2 = Files.createTempFile(tmpDir, customFilePrefix, customFileSuffix);
11
12
try (DirectoryStream<Path> ds = Files.newDirectoryStream(tmpDir)) {
13
tmpDir.toFile().deleteOnExit();
14
15
for (Path file: ds) {
16
file.toFile().deleteOnExit();
17
}
18
} catch (IOException e) {
19
...
20
}
21
22
// simulate some operations with temp file until delete it
23
Thread.sleep(10000);
24
} catch (IOException | InterruptedException e) {
25
...
26
}
通過DELETE_ON_CLOSE删除臨時檔案
删除臨時檔案所依賴的另一個解決方案 StandardOpenOption.DELETE_ON_CLOSE (在關閉流時删除該檔案)。例如,下面的代碼段通過createTempFile() 方法建立一個臨時檔案,并為該檔案打開一個DELETE_ON_CLOSE 顯式指定的緩沖寫流:
Java
1
Path customBaseDir = FileSystems.getDefault().getPath("D:/tmp");
2
String customFilePrefix = "log_";
3
String customFileSuffix = ".txt";
4
Path tmpFile = null;
5
6
try {
7
tmpFile = Files.createTempFile(
8
customBaseDir, customFilePrefix, customFileSuffix);
9
} catch (IOException e) {
10
...
11
}
12
13
try (BufferedWriter bw = Files.newBufferedWriter(tmpFile,
14
StandardCharsets.UTF_8, StandardOpenOption.DELETE_ON_CLOSE)) {
15
16
//simulate some operations with temp file until delete it
17
Thread.sleep(10000);
18
} catch (IOException | InterruptedException e) {
19
...
20
}
最後,開發這麼多年我也總結了一套學習Java的資料與面試題,如果你在技術上面想提升自己的話,可以關注我,私信發送領取資料或者在評論區留下自己的聯系方式,有時間記得幫我點下轉發讓跟多的人看到哦。