138

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?

Paul Sweatte
  • 24,148
  • 7
  • 127
  • 265
Zach Hirsch
  • 24,631
  • 8
  • 32
  • 29

10 Answers10

145

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:

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

By default this value should come from the TMP environment variable on Windows systems

aholub7x
  • 808
  • 12
  • 26
Bryan Kyle
  • 13,361
  • 4
  • 40
  • 45
  • 3
    This doesn't answer my question. Is there an environment variable that controls this? – Zach Hirsch Dec 17 '09 at 19:59
  • 3
    Despite your edit, Bryan, java.io.tmpdir definitely doesn't follow the TMPDIR environment variable on Mac or on Ubuntu (tested on 6.06). – delfuego Dec 17 '09 at 20:16
  • 1
    @Zach. The answer is platform specific. – Stephen C Dec 17 '09 at 23:54
  • 18
    It's not that simple and this answer is still incorrect. On Windows, `java.io.tmpdir` is defined by using the Windows SDK function `GetTempPath` (http://msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx) which will resolve to TMP or TEMP or USERPROFILE or the Windows directory if each of the previous is not defined. – Pascal Thivent Dec 18 '09 at 00:58
132

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.

On Linux and Solaris, the same get_temp_directory() functions return a static value of /tmp/.

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.

David Foerster
  • 1,461
  • 1
  • 14
  • 23
delfuego
  • 14,085
  • 4
  • 39
  • 39
  • 48
    To be clear, what you are looking at is the native code that provides the *default value* for the "java.io.tmpdir" property when the JVM creates the System properties object. This will be overridden by (for example) a "-Djava.io.tmpdir=..." option. – Stephen C Dec 17 '09 at 23:57
  • 7
    @StephenC, yep, that's the point -- the OP was looking for how the default value for the property gets set in the absence of setting it yourself (via the `-Djava.io.tmpdir` command line option to the JVM), and if that default value is affected at all by an environment value. As people had observed, on Windows it **is** affected by the `TMP` environment variable, but it was unclear if there was some unknown variable for other OSes. It looks like there isn't, at least given what we know about OpenJDK. – delfuego Dec 18 '09 at 03:16
  • 5
    Nice answer, but on Windows `GetTempPath()` is not affected just by the `TMP` environment variable: http://msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx – Dan Berindei May 29 '12 at 15:12
  • I've seen that on Solaris Sun JDK the value is `/var/tmp/` (with leading slash), there is even [bug#4391434](http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4391434) for that. And [for Mac OS and Linux it is `/tmp`](http://rationalpi.wordpress.com/2007/01/26/javaiotmpdir-inconsitency/) — what a mess! – dma_k May 30 '12 at 09:33
  • -Djava.io.tmpdir doesn't work on linux with java8 (open jdk 1.8). – Znik Apr 29 '16 at 11:38
  • 1
    @Znik does work with `oracle-java8-jdk=8u102` (linux) – Alex Sep 01 '16 at 21:05
  • On OpenJDK on Ubuntu I get `/tmp` when writing a small test program that just prints out the property, but for some reason, Google's `createTempDir` from [here](https://google.github.io/guava/releases/19.0/api/docs/src-html/com/google/common/io/Files.html#line.423), getting that property the same way I did, is coming up with `var/tmp`, *without* the leading slash. I determined this by running [Druid](http://druid.io/) under strace and looking at all the calls to `mkdir`. – Throw Away Account Apr 05 '17 at 21:55
76

You could set your _JAVA_OPTIONS environmental variable. For example in bash this would do the trick:

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

I put that into my bash login script and it seems to do the trick.

David Foerster
  • 1,461
  • 1
  • 14
  • 23
John St. John
  • 1,542
  • 1
  • 13
  • 22
  • 4
    While this seems to work on Linux and MacOSX, it has the unfortunate side effect of printing some additional output on every java launch: `Picked up _JAVA_OPTIONS:` This completely confuses our build process. – marc.guenther Oct 20 '11 at 14:26
  • 4
    I did up vote this answer because it does answer the users question and the user didn't specify the OS or wanting to avoid any other side affects. I believe this should be set as best answer – R. van Twisk Jul 23 '12 at 17:08
  • 5
    This variable seems to be specific to Sun JVM -- f.e. the IBM J9 JVM does not support it; it does support IBM_JAVA_OPTIONS instead – sendmoreinfo Oct 09 '14 at 09:59
  • 1
    @sendmoreinfo, it works for Sun/Oracle and OpenJDK to my knowledge. – John St. John Oct 09 '14 at 17:08
  • 3
    According to [this answer](https://stackoverflow.com/questions/28327620/#33556407) about the differences between environment variables, `JAVA_TOOL_OPTIONS` is more portable. – EndlosSchleife Mar 06 '19 at 16:52
  • Just want to note for anyone who tries this, you may already have that environment variable defined. So may want to keep those previous values. `export _JAVA_OPTIONS="${_JAVA_OPTIONS} -Djava.io.tmpdir=/new/tmp"` – Charm000 Dec 31 '22 at 17:41
43

Use

$ java -XshowSettings
Property settings:
    java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre
    java.io.tmpdir = /tmp
David Foerster
  • 1,461
  • 1
  • 14
  • 23
Nisar Ahmed
  • 463
  • 4
  • 4
30

It isn't an environment variable, but still gives you control over the temp dir:

-Djava.io.tmpdir

ex.:

java -Djava.io.tmpdir=/mytempdir
David Foerster
  • 1,461
  • 1
  • 14
  • 23
Bozho
  • 588,226
  • 146
  • 1,060
  • 1,140
22

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 -Djava.io.tmpdir=/mytempdir to the java command.

    The property can also be changed from within a program by calling System.setProperty("java.io.tmpdir", "/mytempdir) ... modulo sandbox security issues. However, note that the property is not consulted dynamically. It is read once during class initialization. If you programmatically change the property after that point, it has not effect on the temporary directory.

  • 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.

Stephen C
  • 698,415
  • 94
  • 811
  • 1,216
  • Just a word of caution. Setting this property won't change the directory of things like File.createTempFile will not be affected as it reads the property once to construct a static object that it then uses. – David Bradley Apr 21 '22 at 11:21
10

Use below command on UNIX terminal :

java -XshowSettings

This will display all java properties and system settings. In this look for java.io.tmpdir value.

wscourge
  • 10,657
  • 14
  • 59
  • 80
suhas
  • 135
  • 1
  • 3
0

we can change the default tomcat file upload location, as

we have to set the environment variable like : CATALINA_TEMPDIR = YOUR FILE UPLOAD LOCATION. this location will change the path here: java -Djava.io.tmpdir=/path/to/tmpdir

anudq ece
  • 9
  • 1
  • Please read [How to answer](https://stackoverflow.com/help/how-to-answer) and update your answer with guidelines from the guide. – fartem Feb 04 '21 at 04:42
0

nowadays source: https://github.com/openjdk/jdk/search?l=Java&p=4&q=java.io.tmpdir and only the property is used.

for linux:

// This must be hard coded because it's the system's temporary
// directory not the java application's temp directory, ala java.io.tmpdir.
const char* os::get_temp_directory() { return "/tmp"; }

for windows:

  if (GetTempPath(MAX_PATH, path_buf) > 0) {
    return path_buf;
  } else {

https://github.com/openjdk/jdk/blob/eab4c0c49934bd6f37a0b6174ca10e5c8708d13b/src/hotspot/os/windows/os_windows.cpp#L1366

and here for apple: https://github.com/openjdk/jdk/blob/739769c8fc4b496f08a92225a12d07414537b6c0/src/jdk.attach/macosx/native/libattach/VirtualMachineImpl.c#L322

soloturn
  • 958
  • 9
  • 8
-1

If you look in the source code of the JDK, you can see that for unix systems the property is read at compile time from the paths.h or hard coded. For windows the function GetTempPathW from win32 returns the tmpdir name.

For posix systems you might expect the standard TMPDIR to work, but that is not the case. You can confirm that TMPDIR is not used by running TMPDIR=/mytmp java -XshowSettings

SiggyF
  • 22,088
  • 8
  • 43
  • 57