Java临时文件多线程应用程序



我正在寻找一种万无一失的方法来生成临时文件,该文件在每个JVM的基础上总是以唯一的名称结束。基本上,我想确保在多线程应用程序中,如果两个或多个线程试图在同一时刻创建临时文件,它们都将以唯一的临时文件结束,并且不会抛出异常。

这是我目前拥有的方法:

public File createTempFile(InputStream inputStream) throws FileUtilsException {
    File tempFile = null;
    OutputStream outputStream = null;
    try {
        tempFile = File.createTempFile("app", ".tmp");
        tempFile.deleteOnExit();
        outputStream = new FileOutputStream(tempFile);
        IOUtils.copy(inputStream, outputStream);
    } catch (IOException e) {
        logger.debug("Unable to create temp file", e);
        throw new FileUtilsException(e);
    } finally {
        try { if (outputStream != null) outputStream.close(); } catch (Exception e) {}
        try { if (inputStream != null) inputStream.close(); } catch (Exception e) {}
    }
    return tempFile;
}

这对我的目标来说是完全安全的吗?我查看了下面URL的文档,但我不确定。

看到java.io.File # createTempFile

下面URL的答案回答了我的问题。我发布的方法在多线程单JVM进程环境中是安全的。为了使它在多线程多jvm进程环境(例如集群web应用程序)中更安全,你可以使用Chris Cooper的想法,即在File的前缀参数中传递一个唯一的值。

在每个JVM进程中创建createTempFile方法。

createTempFile线程安全吗?

只需使用线程名和当前时间(单位为毫秒)来命名文件

正是由于这个原因,您可以为临时文件提供不同的前缀或后缀。为每个启动的进程分配一个唯一的ID,并使用该唯一ID作为前缀或后缀,同一VM中的多个线程将不会冲突,现在VM也不会冲突。

最新更新