有没有任何方法可以在不创建文件的情况下创建临时文件路径?
基本上,我需要一个方法Files.createTempFile(...)
的等价物,而无需创建文件。
我可以使用这个变通方法来达到我的目的:
Path pathFile = null;
pathFile = Files.createTempFile("tempFile","");
pathFile.toFile().delete();
但我想用一种更干净的方式。
那存在吗?我找不到。
createTempFile
的代码是类java.nio.file.TempFileHelper
,它是私有的,也是一个实现细节,所以你不能依赖它。然而,阅读它来了解它是如何工作的是一个很好的源文件。
这个代码做了一些事情:
- "修复";权限结构(如果在posix文件系统上(
- 调用CCD_ 4生成一个随机名称
- 尝试制作文件
- 如果#3由于任何原因失败,请循环回2,直到它成功为止
因此,我们找到了你想要什么的根本问题:如果TempFileHelper只向你传达一条路径,那么它所做的主要事情就无法完成。
具体而言:
- 确保权限设置正确。特别是,这个文件不能被其他任何东西读取或写入。这不能在
Path
对象中传递 - 确保文件在创建时(因为生成临时文件名还有什么意义?(实际上是"合适的":它实际上是刚刚为您创建的,具有正确的权限。在Path对象中也无法传达这一点
生成名称的实际代码很琐碎。它不需要检查文件名是否为"空闲"(如果创建文件不起作用,则会重新尝试循环结构(。
这就是:
private static Path generatePath(String prefix, String suffix, Path dir) {
long n = random.nextLong();
String s = prefix + Long.toUnsignedString(n) + suffix;
Path name = dir.getFileSystem().getPath(s);
// the generated name should be a simple file name
if (name.getParent() != null)
throw new IllegalArgumentException("Invalid prefix or suffix");
return dir.resolve(name);
}
此外,如果您没有明确指定要在哪个目录中创建文件,TempFileHelper的代码将使用tmpdir
:的值
private static final Path tmpdir =
Path.of(GetPropertyAction.privilegedGetProperty("java.io.tmpdir"));
我想你的基本问题是"我能自己说吗"。完整回答您的问题:
我认为你低估了临时文件的含义。请仔细检查你的假设。例如,假设你有一个API要求提供"临时文件路径",你几乎无法保证这一点。你不知道以后当你使用这个路径创建文件时,这是否有效(它是"免费"的吗,如中所示,文件当前不存在吗,目录在那里吗?你有写访问权限吗?(,也不是安全性设置正确(设置尽可能多的标志以确保系统上有权访问它的实体尽可能少(。那么,大多数情况下,这听起来像是一项任务,如果你对它进行了适当的假设,那它是无用的,那么你为什么要这样做呢?
为"生成随机名称"部分提供动力的代码几乎微不足道。使用sysproperty
java.io.tmpdir
和上面的代码。这只是TempFileHelper所做工作的一小部分。生成随机名称部分不是公共的API,也不太可能是公共的,因为这将是一个设计非常糟糕的API:这意味着要求随机文件名对于生成tmp文件是有用的。但事实并非如此,那将是糟糕的API。
您的解决方法大多有相同的问题:这只是意味着在您生成Path对象时,该文件是"自由的"、正确的权限和可写的,但它无法实现这些承诺。
更好的解决方案
为什么不制作一个函数或类似的"制作文件"的东西呢?
@FunctionalInterface
function OutputMaker {
public OutputStream make() throws IOException;
}
// and an implementation of this:
OutputMaker tempFileMaker = () -> {
Path p = Files.createTempFile("tempFile", "");
return Files.newOutputStream(p);
};
这个界面可能看起来有所不同;你的问题并没有解释你想用临时路径"做什么"。