Java 创建临时文件时系统找不到路径

Java 创建临时文件时系统找不到路径,java,Java,我在调用java函数createTempFile(“test”,“test”)时遇到一个异常,它说“系统找不到指定的路径”。 尝试过谷歌搜索,但没有成功。 有人知道java从何处获得其默认临时路径以及如何找不到它吗? Windows变量似乎是正确的,更改它们不会影响java 有人知道java从哪里获得默认临时路径吗 它是从java.io.tmpdir属性读取的 Files.createTempFile("test", "test"); 本质上调用java.nio.file.TempFileHe

我在调用java函数
createTempFile(“test”,“test”)
时遇到一个异常,它说“系统找不到指定的路径”。 尝试过谷歌搜索,但没有成功。 有人知道java从何处获得其默认临时路径以及如何找不到它吗? Windows变量似乎是正确的,更改它们不会影响java

有人知道java从哪里获得默认临时路径吗

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

Files.createTempFile("test", "test");
本质上调用
java.nio.file.TempFileHelper.createTempFile(null,前缀,后缀,attrs)
再次调用
java.nio.file.TempFileHelper.create(dir、前缀、后缀、false、attrs)。在这里,如果
dir
为空,则将其设置为
tmpdir
,声明如下:

private static final Path tmpdir =
    Paths.get(doPrivileged(new GetPropertyAction("java.io.tmpdir")));
您可以显式设置属性,如@Joni的答案所示。如果没有显式设置,JVM会在启动时将其初始化为特定于平台的默认值-另请参阅

怎么找不到呢?


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

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

java -Djava.io.tmpdir=/path/to/where/ever/you/like YourClass
如果您想知道默认值来自何处,您必须阅读JVM的源代码。例如,Windows上的OpenJDK调用API函数(在JDK源代码中搜索文件
java_props_md.c
),该函数通过以下方式在环境变量和注册表中查找路径:

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

  • TMP环境变量指定的路径
  • 由TEMP环境变量指定的路径
  • USERPROFILE环境变量指定的路径
  • Windows目录
  • 请注意,该函数不验证路径是否存在,也不测试当前进程是否具有任何类型的路径访问权限

    尝试:

    请参阅:

    为了完整起见,这里还添加了Java的类中的方法和方法

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

    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
    
    此代码的输出为:

    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
    

    检查字符串dirName=System.getProperty(“java.io.tmpdir”)中的内容;还可以尝试使用以下文件定义tempDir direclty:File.createTempFile(字符串前缀、字符串后缀、文件目录)File.createTempFile(“test”、“test”)是prettymuch while代码:)如果不确定,还可以将运行时源(src.zip)附加到IDE,开始调试并进入
    createTempFile()
    method查看失败的地方但是如果我更改了TMP env变量,那么java.io.tmpdir仍然会打印到以前的oodatuim?假设“oodatuim”意味着目录:也许你的程序是用重置TMP的脚本启动的,也许你需要重新启动系统以使更改生效,也许你的JVM没有使用GetTempPath函数,根据提供的数据是不可能知道的。