调用 java 函数时出现“系统找不到指定的路径”的异常createTempFile("test", "test")
。尝试谷歌搜索但没有运气。有谁知道java从哪里得到它的默认临时路径,怎么找不到它?Windows 变量似乎是正确的,更改它们不会影响 java。
3 回答
有谁知道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
指向无效目录,则无法创建临时文件。
与如何获取默认值无关,您可以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
函数按以下顺序检查环境变量是否存在,并使用找到的第一个路径:
- TMP 环境变量指定的路径。
- TEMP 环境变量指定的路径。
- USERPROFILE 环境变量指定的路径。
- Windows 目录。
请注意,该函数不会验证路径是否存在,也不会测试当前进程是否具有对该路径的任何访问权限。
尝试:
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