控制 java.io.tmpdir 的环境变量?

我使用了 TMP环境变量来控制像 gcc 写入临时文件的地方这样的事情,但是我似乎找不到与 java 的 CreateTempFile API 等价的东西。

这样的环境变量存在吗?

362500 次浏览

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

-Djava.io.tmpdir

例如:

java -Djava.io.tmpdir=/mytempdir

根据 java.io.File Java 文档

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

要指定 java.io.tmpdir System 属性,可以按以下方式调用 JVM:

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

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

嗯——因为这是由 JVM 处理的,所以我深入研究了一下 OpenJDK VM 源代码,认为也许 OpenJDK 所做的事情模仿了 Java 6和之前的代码。除了 Windows 之外,还有其他方法可以做到这一点,这并不能让人放心。

窗户上,OpenJDK 的 get_temp_directory()函数对 GetTempPath()进行 Win32 API 调用,这就是在 Windows 上,Java 如何反映 TMP环境变量的价值。

Linux索拉里斯上,相同的 get_temp_directory()函数返回一个静态值 /tmp/

我不知道实际的 JDK6是否遵循了这些确切的约定,但从列出的每个平台上的行为来看,它们似乎都遵循了这些约定。

要弄清楚这里发生了什么:

  • 设置临时目录位置的推荐方法是设置 System 属性“ java.io.tmpdir”,例如,为 java命令提供选项 -Djava.io.tmpdir=/mytempdir

    该属性也可以通过调用 System.setProperty("java.io.tmpdir", "/mytempdir)... 模块沙箱安全问题从程序内部进行更改。但是,请注意,不会动态查询该属性。在类初始化期间读取 一次。如果在该点之后以编程方式更改属性,则在临时目录中使用 没有效果

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

根据经验,“ tMP”环境变量可以在 Windows 上运行(使用当前的 JVM) ,但不能在其他平台上运行。如果您关心可移植性,那么应该显式地设置系统属性。

您可以设置 _JAVA_OPTIONS环境变量:

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

我把它放到我的 bash 登录脚本中,它似乎起到了作用。

使用

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

在 UNIX 终端上使用以下命令:

java -XshowSettings

这将显示所有的 java 属性和系统设置。 在此查找 java.io.tmpdir值。

如果查看 JDK 的源代码,可以看到对于 unix 系统,该属性是在 编译时从 paths.h 或 hard coded读取的。对于 窗户,函数 GetTempPathWWin32返回 tmpdir名称。

对于 posix 系统,您可能期望 标准TMPDIR能够工作,但事实并非如此。通过运行 TMPDIR=/mytmp java -XshowSettings,可以确认没有使用 TMPDIR

我们可以更改默认的 tomcat 文件上传位置,如

我们必须设置这样的环境变量: CATALINA _ tempdir = YOUR FILE UPLOAD LOCATION。 这个位置将改变这里的路径: java-Djava.io.tmpdir =/path/to/tmpdir