我正在寻找一种简单的方法来生成一个临时文件,该文件在每个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;
}
这对我的目标是否完全安全?我查看了以下网址的文档,但我不确定。
答案 0 :(得分:3)
以下网址发布的答案回答了我的问题。我发布的方法在多线程单JVM进程环境中是安全的。为了使其在多线程多JVM进程环境(例如集群Web应用程序)中安全,您可以使用Chris Cooper的想法,即在每个JVM进程中为File.createTempFile方法的prefix参数传递唯一值。
答案 1 :(得分:2)
只需使用毫秒的线程名称和当前时间来命名文件。
答案 2 :(得分:2)
出于这个原因,您可以为临时文件提供不同的前缀或后缀。 为每个启动的进程分配一个唯一的ID,并使用该唯一的id作为前缀或后缀,同一个VM中的多个线程不会发生冲突,现在VM也不会发生冲突。