![](/img/trans.png)
[英]create temp file using utils in java not using : java.io.File.createTempFile()
[英]Why does first call to java.io.File.createTempFile(String,String,File) take 5 seconds on Citrix?
在Citrix服務器上調試Eclipse RCP應用程序的緩慢啟動時,我發現java.io.createTempFile(String,String,File)需要5秒鍾。 它僅在第一次執行時才執行此操作,並且僅對某些用戶帳戶執行此操作。 具體來說,我注意到它是Citrix匿名用戶帳戶。 我沒有嘗試過許多其他類型的帳戶,但是管理員帳戶沒有出現這種現象。
同樣,用戶是否有權寫入給定目錄也沒有關系。 如果用戶沒有訪問權限,則呼叫將花費5秒鍾才能失敗。 如果他們確實可以訪問,則呼叫需要5秒鍾才能成功。
這是在Windows 2003 Server上。 我嘗試了Sun的1.6.0_16和1.6.0_19 JRE,並看到了相同的行為。
我在Google上搜索了一下,期望這是某種已知問題,但沒有發現任何東西。 似乎以前其他人可能不得不遇到過這種情況。
Eclipse平台使用File.createTempFile()來測試各種目錄,以查看它們在初始化期間是否可寫,並且此問題使應用程序的啟動時間增加了5秒。
我想象以前有人遇到過這種情況,也許會有一些見識。 這是我執行的示例代碼,它確實是在浪費時間的此調用。 我還嘗試了第二次調用createTempFile,並注意隨后的調用幾乎立即返回。
public static void main(final String[] args) throws IOException { final File directory = new File(args[0]); final long startTime = System.currentTimeMillis(); File file = null; try { file = File.createTempFile("prefix", "suffix", directory); System.out.println(file.getAbsolutePath()); } finally { System.out.println(System.currentTimeMillis() - startTime); if (file != null) { file.delete(); } } }
該程序的示例輸出如下:
C:\>java.exe -jar filetest.jar C:/Temp C:\Temp\prefix8098550723198856667suffix 5093
可能是安全隨機數生成器的初始化導致了問題。 特別是,如果無法從操作系統獲得安全的隨機種子,則回退機制將嘗試獲取熵。 IIRC的功能之一就是列出臨時文件,因此,如果其中包含大量文件,將對啟動性能沒有幫助。
看來速度緩慢是由於SecureRandom的播種所致,並且僅當用戶是Guests組的成員時才如此。
SecureRandom種子初始化使用Windows Crypto API,當用戶為訪客時,Windows Crypto API將失敗,如此處所述[1]。 通過將系統屬性“ java.security.debug”設置為等於“ all”,當該程序以訪客身份運行時,我可以看到以下內容:
ProviderConfig: Loaded provider SUN version 1.6 provider: Failed to use operating system seed generator: java.io.IOException: Required native CryptoAPI features not available on this machine provider: Using default threaded seed generator
以非來賓用戶身份運行時,輸出為:
ProviderConfig: Loaded provider SUN version 1.6 provider: Using operating system seed generator
似乎默認的線程種子生成器非常慢。 這里[2]是一個非常老的錯誤,已記錄到Sun上。
[1] http://www.derkeiler.com/Newsgroups/microsoft.public.platformsdk.security/2003-12/0349.html
[2] http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4210047
我不是Citrix專家,但我知道是誰,並且誰猜想:
可以設置帳戶,以便將應用程序讀/寫重定向到非本地資源。 您遇到的延遲可能與該分辨率的初始化或性能有關。
另一種可能性是應用程序隔離可能有效,這意味着文件的讀/寫發生在資源的虛擬版本上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.