9

调用 java 函数时出现“系统找不到指定的路径”的异常createTempFile("test", "test")。尝试谷歌搜索但没有运气。有谁知道java从哪里得到它的默认临时路径,怎么找不到它?Windows 变量似乎是正确的,更改它们不会影响 java。

4

3 回答 3

17

有谁知道java从哪里得到它的默认临时路径

它是从java.io.tmpdir属性中读取的。

Files.createTempFile("test", "test");

本质上java.nio.file.TempFileHelper.createTempFile(null, prefix, suffix, attrs);是再次调用的调用java.nio.file.TempFileHelper.create(dir, prefix, suffix, false, attrs);。在那里,如果dir为 null,则将其设置tmpdir为声明如下:

private static final Path tmpdir =
    Paths.get(doPrivileged(new GetPropertyAction("java.io.tmpdir")));

您可以明确设置属性,如@Joni 的答案所示。如果您没有显式设置它,JVM 会在启动时将其初始化为特定于平台的默认值 - 另请参阅控制 java.io.tmpdir 的环境变量?

怎么找不到?

如果属性java.io.tmpdir指向无效目录,则无法创建临时文件。

于 2013-08-08T09:17:25.833 回答
7

与如何获取默认值无关,您可以java.io.tmpdir在启动 JVM 时通过设置系统属性来设置临时文件目录:

java -Djava.io.tmpdir=/path/to/where/ever/you/like YourClass

如果您想知道默认值的来源,则必须阅读 JVM 的源代码。例如,Windows 上的 OpenJDK 调用 API 函数GetTempPathW(在 JDK 源代码中搜索文件java_props_md.c),它通过以下方式在环境变量和注册表中查找路径:

GetTempPath函数按以下顺序检查环境变量是否存在,并使用找到的第一个路径:

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

请注意,该函数不会验证路径是否存在,也不会测试当前进程是否具有对该路径的任何访问权限。

于 2013-08-08T09:17:34.077 回答
3

尝试:

String path = System.getProperty("java.io.tmpdir");

参见:获取属性方法

并且为了完整起见将其添加到此处,还有来自 Java文件类的方法createTempFile(String prefix,String suffix)createTempFile(String prefix, String suffix, File directory)方法。

这是我查找临时文件路径并找到临时路径的代码:

public class GetTempFilePathExample
{
    public static void main(String[] args)
    {   

        try{

            //create a temp file
            File temp = File.createTempFile("temp-file-name", ".tmp"); 

            System.out.println("Temp file : " + temp.getAbsolutePath());

        //Get tempropary file path
            String absolutePath = temp.getAbsolutePath();
            String tempFilePath = absolutePath.
                substring(0,absolutePath.lastIndexOf(File.separator));

            System.out.println("Temp file path : " + tempFilePath);

        }catch(IOException e){

            e.printStackTrace();

        }

    }
}

此代码的输出是:

Temp file : /tmp/temp-file-name3697762749201044262.tmp
Temp file path : /tmp
于 2013-08-08T11:53:50.733 回答