在调试 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,并看到相同的行为。
我用谷歌搜索了一下,希望这是某种已知的问题,但没有找到任何东西。似乎其他人以前也遇到过这种情况。
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,它所做的事情之一就是列出临时文件,所以如果你有大量临时文件,对启动性能没有帮助。
关于java - 为什么在 Citrix 上首次调用 java.io.File.createTempFile(String,String,File) 需要 5 秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2608763/