环境variables来控制java.io.tmpdir?

我使用TMP环境variables来控制gcc写入临时文件的地方,但是我似乎无法find与java的createTempFile API等价的东西。

这样的环境variables是否存在?

嗯,因为这是由JVM处理的,所以我深入研究了OpenJDK VM源代码,认为OpenJDK完成的工作可能会模仿Java 6和之前的版本。 有一种方法可以做到这一点,而不是在Windows上。

在Windows上 ,OpenJDK的get_temp_directory()函数对GetTempPath()进行Win32 API调用; 这是如何在Windows上,Java体现了TMP环境variables的价值。

在Linux和Solaris上 ,同样的get_temp_directory()函数返回静态值/tmp/

我不知道实际的JDK6是否遵循这些确切的约定,但是通过每个列出的平台上的行为,似乎是这样。

根据java.io.File Java Docs

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

要指定java.io.tmpdir系统属性,可以按如下所示调用JVM:

 java -Djava.io.tmpdir=/path/to/tmpdir 

默认情况下,这个值应该来自Windows系统上的TMP环境variables

你可以设置你的_JAVA_OPTIONS环境variables。 举个例子,在bash中,这可以做到这一点:

 export _JAVA_OPTIONS=-Djava.io.tmpdir=/new/tmp/dir 

我把它放到我的bashlogin脚本,它似乎是做的伎俩。

使用

 $ java -XshowSettings Property settings: java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre java.io.tmpdir = /tmp 

这不是一个环境variables,但仍然可以控制临时目录:

 -Djava.io.tmpdir 

例:

 java -Djava.io.tmpdir=/mytempdir 

要清楚这里发生了什么事情:

  • build议设置临时目录位置的方法是设置名为“java.io.tmpdir”的System属性,例如通过给java选项-Djava.io.tmpdir=/mytempdir选项。 该属性也可以通过调用System.setProperty("java.io.tmpdir", "/mytempdir) …模块沙箱安全问题从程序内更改。

  • 如果在启动时没有显式设置“java.io.tmpdir”属性,则JVM将其初始化为特定平台的默认值。 对于Windows,通过调用Win32 API方法获得默认值。 对于Linux / Solaris,默认显然是硬连线的。 对于其他JVM,它可能是其他的东西。

经验上,“TMP”环境variables适用于Windows(使用当前的JVM),但不适用于其他平台。 如果你关心可移植性,你应该明确地设置系统属性。