簡體   English   中英

創建臨時路徑而不創建文件

[英]Create temp path without creating the file

有什么方法可以在不創建文件的情況下創建臨時文件路徑?

基本上我需要一個等效的方法Files.createTempFile(...)而不創建文件。

我可以將此解決方法用於我的目的:

Path pathFile = null;
pathFile = Files.createTempFile("tempFile","");
pathFile.toFile().delete();

但我想使用一種更清潔的方式。

那存在嗎? 我沒找到。

支持createTempFile的代碼是 class java.nio.file.TempFileHelper ,它是私有的,是一個實現細節,所以你不能依賴它。 但是,它是一個很好的源文件,可以閱讀以了解其工作原理。

這段代碼做了幾件事:

  1. 如果在 posix 文件系統上,“修復”權限結構。
  2. 調用generatePath生成一個隨機名稱。
  3. 嘗試制作文件。
  4. 如果 #3 由於任何原因失敗,請循環回到 2 直到它解決。

因此,我們解決了您想要什么的基本問題:如果 TempFileHelper 僅向您傳達一條路徑,那么它所做的主要事情是無法完成的。

具體來說:

  1. 確保權限設置正確。 特別是,這個文件必須盡可能不能被其他任何東西讀取或寫入。 這不能在Path object 中傳達。
  2. 確保文件,如果創建(因為生成臨時文件名還有什么意義?),實際上是“適當的”:它實際上是剛剛為您創建的,具有正確的權限。 您也無法在路徑 object 中傳達這一點。

生成名稱的實際代碼是微不足道的。 它不努力檢查該文件名是否是“免費的”(如果創建文件不起作用,則重新嘗試的循環結構就是為此目的)。

就是這個:

    private static Path generatePath(String prefix, String suffix, Path dir) {
        long n = random.nextLong();
        String s = prefix + Long.toUnsignedString(n) + suffix;
        Path name = dir.getFileSystem().getPath(s);
        // the generated name should be a simple file name
        if (name.getParent() != null)
            throw new IllegalArgumentException("Invalid prefix or suffix");
        return dir.resolve(name);
    }

此外,如果您沒有明確指定要在哪個目錄中創建文件,則 TempFileHelper 的代碼將使用tmpdir的值:

    private static final Path tmpdir =
        Path.of(GetPropertyAction.privilegedGetProperty("java.io.tmpdir"));

我想你的基本問題是'我可以自己調用它'。 要完整回答您的問題:

  1. 我認為您低估了臨時文件的含義。 請仔細檢查您的假設。 例如,假設您有一個 API 來詢問“臨時文件路徑”,那么您幾乎無法保證。 你不知道,以后,當你使用這個路徑來創建一個文件時,它是否會起作用(它是“免費的”嗎,例如,文件當前不存在,目錄在那里嗎?你有寫嗎?訪問?),也沒有正確設置安全性(設置盡可能多的標志以確保系統上的少數實體可以訪問它)。 那么,大多數情況下,這聽起來像這個任務,如果適當地用你必須做出的假設來裝飾,是沒有用的,那么你為什么想要這個呢?

  2. 為“生成隨機名稱”部分提供動力的代碼幾乎是微不足道的。 使用 sysproperty java.io.tmpdir和上面的代碼。 這只是 TempFileHelper 所做的所有事情的一小部分。

  3. 生成隨機名稱部分不是公開的 API 並且不太可能公開,因為這將是一個非常糟糕的設計 API:它暗示要求隨機文件名對於制作 tmp 文件很有用。 但它不是,所以,那會很糟糕 API。

  4. 您的解決方法幾乎存在相同的問題:這僅意味着在您生成路徑 object 時該文件是“免費的”、適當的許可和可寫的,但它無法實現這些承諾。

更好的解決方案?

為什么不制作 function 之類的“制作文件”?

@FunctionalInterface
function OutputMaker {
    public OutputStream make() throws IOException;
}

// and an implementation of this:

OutputMaker tempFileMaker = () -> {
    Path p = Files.createTempFile("tempFile", "");
    return Files.newOutputStream(p);
};

該界面可能必須看起來不同; 你的問題沒有解釋你想用臨時路徑“做什么”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM