I’ve used the
TMP environment variable to control things like where gcc writes it’s temporary files, but I can’t seem to find an equivalent for java’s createTempFile API.
Does such an environment variable exist?
Hmmm — since this is handled by the JVM, I delved into the OpenJDK VM source code a little bit, thinking that maybe what’s done by OpenJDK mimics what’s done by Java 6 and prior. It isn’t reassuring that there’s a way to do this other than on Windows.
On Windows, OpenJDK’s
get_temp_directory() function makes a Win32 API call to
GetTempPath(); this is how on Windows, Java reflects the value of the
TMP environment variable.
I don’t know if the actual JDK6 follows these exact conventions, but by the behavior on each of the listed platforms, it seems like they do.
According to the
java.io.File Java Docs
The default temporary-file directory is specified by the system property java.io.tmpdir. On UNIX systems the default value of this property is typically “/tmp” or “/var/tmp”; on Microsoft Windows systems it is typically “c:\temp”. A different value may be given to this system property when the Java virtual machine is invoked, but programmatic changes to this property are not guaranteed to have any effect upon the the temporary directory used by this method.
To specify the
java.io.tmpdir System property, you can invoke the JVM as follows:
By default this value should come from the
TMP environment variable on Windows systems
You could set your
_JAVA_OPTIONS environmental variable. For example in bash this would do the trick:
I put that into my bash login script and it seems to do the trick.
$ java -XshowSettings Property settings: java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre java.io.tmpdir = /tmp
It isn’t an environment variable, but still gives you control over the temp dir:
To be clear about what is going on here:
The recommended way to set the temporary directory location is to set the System property called “java.io.tmpdir”, e.g. by giving the option
javacommand. The property can also be changed from within a program by calling
System.setProperty("java.io.tmpdir", "/mytempdir)… modulo sandbox security issues.
If you don’t explicitly set the “java.io.tmpdir” property on startup, the JVM initializes it to a platform specific default value. For Windows, the default is obtained by a call to a Win32 API method. For Linux / Solaris the default is apparently hard-wired. For other JVMs it could be something else.
Empirically, the “TMP” environment variable works on Windows (with current JVMs), but not on other platforms. If you care about portability you should explicitly set the system property.