![](/img/trans.png)
[英]How to get the icon for a file extension or filetype without creating a temp file?
[英]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
,它是私有的,是一個實現細節,所以你不能依賴它。 但是,它是一個很好的源文件,可以閱讀以了解其工作原理。
這段代碼做了幾件事:
generatePath
生成一個隨機名稱。因此,我們解決了您想要什么的基本問題:如果 TempFileHelper 僅向您傳達一條路徑,那么它所做的主要事情是無法完成的。
具體來說:
Path
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"));
我想你的基本問題是'我可以自己調用它'。 要完整回答您的問題:
我認為您低估了臨時文件的含義。 請仔細檢查您的假設。 例如,假設您有一個 API 來詢問“臨時文件路徑”,那么您幾乎無法保證。 你不知道,以后,當你使用這個路徑來創建一個文件時,它是否會起作用(它是“免費的”嗎,例如,文件當前不存在,目錄在那里嗎?你有寫嗎?訪問?),也沒有正確設置安全性(設置盡可能多的標志以確保系統上的少數實體可以訪問它)。 那么,大多數情況下,這聽起來像這個任務,如果適當地用你必須做出的假設來裝飾,是沒有用的,那么你為什么想要這個呢?
為“生成隨機名稱”部分提供動力的代碼幾乎是微不足道的。 使用 sysproperty java.io.tmpdir
和上面的代碼。 這只是 TempFileHelper 所做的所有事情的一小部分。
生成隨機名稱部分不是公開的 API 並且不太可能公開,因為這將是一個非常糟糕的設計 API:它暗示要求隨機文件名對於制作 tmp 文件很有用。 但它不是,所以,那會很糟糕 API。
您的解決方法幾乎存在相同的問題:這僅意味着在您生成路徑 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.