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

Java 创建临时路径而不创建文件,java,file,path,temp,Java,File,Path,Temp,有没有办法在不创建临时文件的情况下创建临时文件路径 基本上,我需要一个方法Files.createTempFile(…)的等价物,而不创建文件 我可以将此变通方法用于我的目的: Path pathFile = null; pathFile = Files.createTempFile("tempFile",""); pathFile.toFile().delete(); 但我想用一种更干净的方式 这是否存在?我找不到它。支持createTempFile的

有没有办法在不创建临时文件的情况下创建临时文件路径

基本上,我需要一个方法
Files.createTempFile(…)
的等价物,而不创建文件

我可以将此变通方法用于我的目的:

Path pathFile = null;
pathFile = Files.createTempFile("tempFile","");
pathFile.toFile().delete();
但我想用一种更干净的方式


这是否存在?我找不到它。

支持
createTempFile
的代码是类
java.nio.file.TempFileHelper
,它是私有的,是一个实现细节,因此您不能依赖它。然而,阅读它是一个很好的源文件,可以了解它是如何工作的

此代码执行以下几项操作:

  • “修复”posix文件系统上的权限结构
  • 调用
    generatePath
    生成一个随机名称
  • 尝试创建文件
  • 如果#3因任何原因失败,则返回到2,直到它成功为止
  • 因此,我们得到了你想要什么的基本问题:如果TempFileHelper只向你传达了一条路径,那么它所做的主要事情就无法完成

    具体而言:

  • 确保权限设置正确。特别是,此文件必须尽可能不可被任何其他文件读取或写入。这不能在
    路径
    对象中传递
  • 确保创建的文件(因为生成临时文件名还有什么意义?)实际上是“适当的”:它实际上是刚刚为您创建的,具有正确的权限。您也不能在路径对象中传达这一点
  • 生成名称的实际代码很简单。它不需要检查该文件名是否为“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);
    };
    

    该接口可能必须看起来不同;您的问题没有解释您想用临时路径“做”什么。

    没有方法可以这样做的原因是,创建临时文件路径而不同时自动创建文件会创建一个可利用的竞争条件。而且“这里有一个不存在的文件名”很容易被利用。您真正得到的只是“这里有一个我检查时不存在的文件名,但现在可能存在,所以您不能依赖它不存在”。一个用例:AWS需要一个有效的路径,指向一个不存在的文件。@AdamMillerchip find。这是我第二次在AWS库中看到完全愚蠢的API设计。我猜这是很多API端点,因此有很多机会真的搞砸了:(