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

2019-09-01 20:35发布

只是好奇,当System.getProperty("java.io.tmpdir")返回"c:\temp" 按照java.io.File的 Java文档 -

默认的临时文件目录由系统属性java.io.tmpdir指定。 在UNIX系统上该属性的默认值通常是“/ tmp中”或“/ var / tmp中”; 在Microsoft Windows系统它一般是 “C:\ TEMP”。 不同的值可以被提供给该系统属性被调用Java虚拟机的情况下,但这个属性方案变化不能保证有在通过此方法中使用的临时目录中的任何效果。

但在我的病例

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

始终returns-

C:\Users\admin\AppData\Local\Temp\ i.e. %TEMP%

在何种条件下,它返回"c:\temp"

编辑:如果我更改%TEMP%到C:\ TEMP,然后我会得到C:\ TEMP,对不对? 但是,文档显示C:\ TEMP,而不是C:\ TEMP。

Answer 1:

在微软Windows临时目录由环境变量设置TEMP 。 在XP中,临时目录是每个用户设置为本地设置的\ Temp。

如果你改变你的TEMP环境变量C:\temp ,那么你得到同样的,当你运行:

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



Answer 2:

如果设置

-Djava.io.tmpdir=C:\temp


Answer 3:

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

在下列顺序环境变量存在的GetTempPath功能检查,并使用找到的第一个路径:

  1. 由TMP环境变量指定的路径。
  2. 由TEMP环境变量指定的路径。
  3. 由USERPROFILE环境变量指定的路径。
  4. Windows目录。

在另一方面,请为什么历史原因TMPTEMP并存 。 这真是值得一读。



Answer 4:

%TEMP%环境变量通常是用户特定的和Windows用当前在用户帐户登录方面对其进行设置。 当你的进程作为一个服务的一些用户帐户可能没有用户资料,例如SYSTEMLOCALSYSTEM或其他内置帐户,或者是通过IIS应用程序与创建禁用的用户配置文件选项的应用程序池的身份调用。 所以,即使你不覆盖%TEMP%变量明确,Windows可能会使用c:\temp甚至c:\windows\temp的文件夹,让说,非通常的用户帐户。 什么是更重要的,过程可能没有访问权限,这个目录!



文章来源: When does System.getProperty(“java.io.tmpdir”) return “c:\\temp”