在 Java 中建立臨時檔案

Mohd Mohtashim Nawaz 2023年1月30日 2022年5月1日
  1. 在 Java 中使用 Java Legacy IO 建立臨時檔案
  2. 在 Java 中使用 Java NIO 庫建立臨時檔案
  3. 在 Java 中建立臨時檔案時要處理的隱藏異常
  4. まとめ
在 Java 中建立臨時檔案

本文將演示如何使用不同的替代方法在 Java 中建立臨時檔案。

我們使用 Java 中的臨時檔案來儲存程式執行期間的臨時資訊、釋放資源或將資訊傳遞給程式的其他部分。

在 Java 中使用 Java Legacy IO 建立臨時檔案

我們可以使用 java.io 包中的標準檔案庫在 Java 中建立臨時檔案。我們使用一種 createTempFile() 方法來製作臨時檔案。

讓我們一一瞭解這兩種多型形式。

在 Java 中建立臨時檔案的第一個多型形式的方法

我們可以在第一個實現中傳遞兩個引數:prefixsuffix。通過將字首和字尾新增到識別符號來生成檔名。

JVM 本身會生成識別符號。臨時檔案的名稱類似於下面給出的形式。

prefixIDsuffix

當我們使用這種方法建立臨時檔案時,臨時檔案儲存在臨時檔案的預設目錄中。用於儲存臨時檔案的預設目錄可能因作業系統而異。

\tmp 目錄是 Linux 作業系統中臨時檔案的預設目錄。如果我們使用 Windows 平臺,預設目錄一般是 C:\\WINNT\\TEMP

讓我們看看 createTempFile() 方法的第一種多型形式的定義。

public static File createTempFile(String prefix,
                String suffix)
                        throws IOException

正如我們所見,這個方法丟擲了 IOException。因此,在使用此方法時,我們應該使用 try-catch 塊。

如果我們不想使用 try-catch 塊,我們的方法應該丟擲相同的異常以便稍後由我們或 JVM 處理它。

該方法返回一個 File 物件,其中包含建立的臨時檔案的絕對路徑。

程式碼:

import java.io.File;
import java.io.IOException;

public class tempFile {
    public static void main(String[] args) {
        try
        {
            File file = File.createTempFile("myTemp", ".tmp");
            System.out.print(file);
            file.deleteOnExit();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}

輸出:

/tmp/myTemp14969130618851885659.tmp

如果我們不提供任何字尾引數,JVM 會新增預設的 .tmp 字尾。但是,我們不能省略字首引數,它的長度至少應為三個字元。

我們使用了 deleteOnExit() 方法,在 JVM 退出時刪除檔案。我們應該始終在使用結束時刪除臨時檔案作為一種好習慣。

Java 中建立臨時檔案的方法的第二種多型形式

我們可以在 createTempFile() 方法的第二個多型實現中提供三個引數。正如我們上面討論的,前兩個引數是相似的。

第三個引數是一個 File 物件,我們可以使用它來為我們的臨時檔案提供特定的路徑。如果我們將 null 傳遞給第三個引數,則此實現的工作方式與第一個相同。

讓我們看看 createTempFile() 方法的第二種多型形式的方法定義。

public static File createTempFile(String prefix,
                String suffix,
                File directory)
                        throws IOException

此形式的命名約定、異常和所有其他工作方式與該方法的先前形式相同。

讓我們看看使用這種方法建立臨時檔案的程式碼。

import java.io.File;
import java.io.IOException;

public class tempFile {
    public static void main(String[] args) {
        try
        {
            File path =  new File("/home/stark/eclipse-workspace-java/JavaArticles");
            File file = File.createTempFile("myTemp",".tmp", path);
            System.out.print(file);
            file.deleteOnExit();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}

輸出:

/home/stark/eclipse-workspace-java/JavaArticles/myTemp10717312880412401466.tmp

我們應該注意,臨時檔案是在程式碼中提供的目錄中建立的,而不是在預設目錄中建立的。

在 Java 中使用 Java NIO 庫建立臨時檔案

我們可以使用替代的 java.nio.file.Files 庫在執行時建立臨時檔案。這個庫的行為類似於我們討論過的傳統 Java IO 庫。

NIO 庫還提供了 createTempFile() 方法的兩種多型形式。兩種多型形式的區別在於,另一種讓我們傳遞檔案路徑。

該檔案的名稱是使用字首和字尾以及類似於 Java 傳統 IO 庫的識別符號建立的。如上所述,臨時檔案的預設路徑也與 Java 遺留的 IO 庫相同。

用於建立臨時檔案的傳統 Java IO 方法與 NIO 庫之間的顯著區別在於,我們使用 NIO 庫可以更好地控制檔案的安全引數。

讓我們看看 createTempFile() 方法的兩種多型形式的方法定義。

public static Path createTempFile(String prefix,
                String suffix,
                FileAttribute<?>... attrs)
                        throws IOException

上面給出的多型形式是第一種形式。下面給出第二種多晶型。

public static Path createTempFile(Path dir,
                String prefix,
                String suffix,
                FileAttribute<?>... attrs)
                        throws IOException

我們可以在這兩種多型形式中找到 FileAttribute 引數。我們可以使用這個引數來提供檔案級屬性的列表,例如許可權。

這些方法返回一個 Path 物件,該物件表示該方法建立的臨時檔案的路徑。

讓我們看看使用這個庫建立臨時檔案的程式碼。

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Set;


public class tempFile2 {
    public static void main(String [] args)
    {
        try 
        {
            Path path = Paths.get("/home/stark/eclipse-workspace-java/JavaArticles");

            Set<PosixFilePermission> filePerm = PosixFilePermissions.fromString("rwxrwxrwx");
            FileAttribute<Set<PosixFilePermission>> fileAttr = PosixFilePermissions.asFileAttribute(filePerm);

            Path temp = Files.createTempFile(path, "myTemp", ".tmp", fileAttr);
            System.out.print(temp);

            File file = new File(path.toString());
            file.deleteOnExit();
        } 
        catch (IOException e) 
        {

        }
    }
}

該程式碼使用了 createTempFile() 方法的所有四個引數。我們可以根據需要省略引數。

但是,請記住字首引數不能省略。

如果我們省略 Path 引數,我們將使用方法的第一種多型形式,臨時檔案將儲存到臨時檔案的預設目錄。

如果我們省略 FileAttribute 引數,將使用預設許可權建立檔案。

該程式碼還使用 PosixFilePermissions 庫使用簡單的字串定義檔案許可權。我們可以在這裡閱讀更多關於它的資訊。

我們應該注意到 NIO 庫沒有自己的 deleteOnExit() 方法。因此,程式碼使用遺留的 IO 檔案庫來刪除臨時檔案。

輸出:

/home/stark/eclipse-workspace-java/JavaArticles/myTemp5731129001304860331.tmp

在 Java 中建立臨時檔案時要處理的隱藏異常

雖然我們已經看到用於建立臨時檔案的 Java 遺留 IO 庫和 NIO 庫方法丟擲 IOException,但也有一些隱藏的異常我們應該牢記。

這些異常是隱藏的,因為它們不是使用方法本身直接引發的。由於方法內部的其他執行,這些反而被丟擲。

  1. SecurityException:由於作業系統不允許程式建立臨時檔案,我們可以得到這個異常。
  2. IllegalArgumentException:當我們傳遞一些 Java 虛擬機器無法識別的奇怪引數時,我們會得到這個異常。
  3. FileAlreadyExistsException:如果我們指定 CREATE_NEW 檔案屬性選項,並且檔案已經存在,我們會收到此異常。
  4. UnsupportedOperationException:當我們指定了一個無法識別的檔案屬性時,該方法會丟擲這個異常。

まとめ

在本文中,我們看到了兩個不同的庫來在 Java 中建立臨時檔案。Java 遺留 IO 庫被廣泛使用,但我們可以使用 NIO 庫對檔案許可權進行更嚴格的控制。

但是,如果我們不指定檔案是使用預設許可權建立的,則它可能具有高度受限的許可權。

相關文章 - Java File