什么时候System.getProperty(“java.io.tmpdir”)返回“c:\ temp”

只是好奇当System.getProperty("java.io.tmpdir")返回"c:\temp" 。 根据java.io.File Java Docs –

默认的临时文件目录由系统属性java.io.tmpdir指定。 在UNIX系统上,这个属性的默认值通常是“/ tmp”或“/ var / tmp”; 在Microsoft Windows系统上,它通常是“c:\ temp”。 在调用Java虚拟机时,可能会给此系统属性赋予不同的值,但对此属性的编程更改不保证对此方法使用的临时目录有任何影响。

但在我的情况下,

 System.out.println(System.getProperty("java.io.tmpdir")); 

总是返回 –

 C:\Users\admin\AppData\Local\Temp\ ie %TEMP% 

在什么情况下会返回"c:\temp"

编辑:如果我将%TEMP%更改为C:\ Temp,那么我将得到C:\ Temp,对不对? 但是文档显示c:\ Temp而不是C:\ Temp。

在MS Windows中,临时目录由环境variablesTEMP 。 在XP中,临时目录是按用户设置的本地设置\温度。

如果将TEMP环境variables更改为C:\temp ,则在运行时会得到相同的结果:

System.out.println(System.getProperty("java.io.tmpdir"));

如果你设置

 -Djava.io.tmpdir=C:\temp 

一方面,当你调用System.getProperty("java.io.tmpdir")指令时,Java调用Win32 API的函数GetTempPath 。 根据MSDN :

GetTempPath函数按照以下顺序检查是否存在环境variables,并使用find的第一个path:

  1. 由TMP环境variables指定的path。
  2. 由TEMP环境variables指定的path。
  3. USERPROFILE环境variables指定的path。
  4. Windows目录。

另一方面,请查看TMPTEMP为什么共存的历史原因 。 这真的值得一读。

%TEMP%环境variables的值通常是特定于用户的,Windows会针对当前login的用户帐户进行设置。 某些用户帐户可能没有用户configuration文件,例如,当您的进程在SYSTEMLOCALSYSTEM或其他内置帐户中作为服务运行时,或者被禁用了“ 创build用户configuration文件”选项的AppPool身份的IIS应用程序调用时。 所以,即使你没有明确地覆盖%TEMP%variables,Windows也可以使用c:\temp甚至c:\windows\temp文件夹,比如说,非常用的用户帐户。 而更重要的是,进程可能没有这个目录的访问权限!