2013-03-21 18 views
3

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

这是我的方法目前有:

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

+0

我认为这个问题是在这里找到答案:http://stackoverflow.com/questions/4702537/is-createtempfile-thread-safe – 2013-03-21 17:15:55

+0

根据javadoc的这种方法可能会抛出异常,因此你的代码应该是能够处理这些例外。比重名等原因,可能会出现错误,例如磁盘故障等 编辑:另外这个方法是静态的,所以线程(如果你信任你的JDK实现) – 2013-03-21 17:16:56

+0

@AndreasBakurov - 仅仅因为一个方法被标记'static'不**使它线程安全。实际上,标记“static”通常是线程/并发错误的原因。 – 2013-03-21 17:28:41

回答

3

答案发布在下面的URL回答我的问题。我发布的方法在多线程的单个JVM进程环境中是安全的。为了在多线程多JVM流程环境(例如集群Web应用程序)中保证安全,您可以使用Chris Cooper的想法,该思路包括在每个JVM进程中的File.createTempFile方法的前缀参数中传递一个唯一值。

Is createTempFile thread-safe?

2

只需使用线程名和当前时间以毫秒来命名文件。

+0

那么这是否意味着我的方法并不能完全防止多线程情况下文件名冲突的可能性? 我想避免不必要的唯一文件名生成或循环,以确保这项工作。如果这是绝对必要的我会做,但我试图保持尽可能干净。 – Kabron 2013-03-26 14:11:32

2

出于这个确切原因,您可以为临时文件提供不同的前缀或后缀。 为每个启动的进程分配一个唯一的ID,并将该唯一ID用作前缀或后缀,同一虚拟机中的多个线程不会发生冲突,现在虚拟机也不会发生冲突。

+0

我更感兴趣的是知道我拥有的方法在单个多线程JVM进程中是否完全安全。 – Kabron 2013-03-26 14:05:26