创建临时路径而不创建文件

c86crjj0  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(478)

有没有办法在不创建临时文件的情况下创建临时文件路径?
基本上我需要一个等效的方法 Files.createTempFile(...) 不创建文件。
我可以将此解决方案用于我的目的:

Path pathFile = null;
pathFile = Files.createTempFile("tempFile","");
pathFile.toFile().delete();

但我想用更干净的方法。
存在吗?我没找到。

kyxcudwk

kyxcudwk1#

权力的准则 createTempFile 是班级吗 java.nio.file.TempFileHelper ,它是私有的,并且是一个实现细节,所以您不能依赖它。不过,要了解它是如何工作的,这是一个很好的源文件。
此代码执行以下操作:
“修复”posix文件系统上的权限结构。
呼叫 generatePath 生成一个随机名称。
试着整理一下文件。
如果#3因任何原因失败,则循环回2,直到成功为止。
因此,我们得到了你想要什么的基本问题:tempfilehelper所做的主要事情不能做,如果它只是向你传达了一条路径。
明确地:
确保权限设置正确。特别是,此文件不能被任何其他文件读写。这不能用一种语言表达 Path 对象。
如果创建了文件(因为生成临时文件名还有什么意义?),请确保该文件实际上是“适当的”:它实际上是为您刚刚创建的,具有正确的权限。你也不能在路径对象中表达这一点。
生成名称的实际代码很简单。它不需要检查文件名是否为“free”(如果创建文件不起作用,则循环结构会重新尝试这样做)。
就是这样:

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所有工作的一小部分。
generate random name部分不是公共api,也不太可能是公共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);
};

这个界面可能看起来不同;你的问题并不能解释你想用一个临时路径做什么。

相关问题