Qual é uma maneira segura de criar um arquivo Temp em Java?

96

Estou procurando uma maneira segura de criar um arquivo temporário em Java. Por seguro, quero dizer o seguinte:

  • O nome deve ser único, mesmo sob condições de corrida em potencial (por exemplo, outro Thread chama a mesma função ao mesmo tempo, ou outro processo executa este código simultaneamente)
  • O arquivo deve ser privado, mesmo em condições de corrida em potencial (por exemplo, outro usuário tenta o arquivo chmod em alta velocidade)
  • Posso dizer para ele excluir o arquivo, sem ter que fazer uma exclusão genérica, e arriscar excluir o arquivo errado
  • O ideal é garantir que o arquivo seja excluído, mesmo que uma exceção seja lançada antes que eu tenha a chance de
  • O arquivo deve ser padronizado para um local adequado (por exemplo, o diretório tmp especificado pela JVM, padronizando para o diretório temporário do sistema)
SRobertJames
fonte
3
Use File f = File.createTempFile(prefix, extension). Ele será colocado no diretório temporário. E com f.deleteOnExit()ele será excluído automaticamente na saída.
BackSlash
3
Excluir ao sair não excluirá o arquivo, se a VM sair com uma exceção.
Johannes

Respostas:

129

Use File.createTempFile().

File tempFile = File.createTempFile("prefix-", "-suffix");
//File tempFile = File.createTempFile("MyAppName-", ".tmp");
tempFile.deleteOnExit();

Irá criar um arquivo no diretório temporário, como:

prefixo-6340763779352094442-sufixo

Stefan
fonte
1
Apenas para sua informação, você não precisa se preocupar em ter um prefixo / sufixo exclusivo, pois o Java criará uma string aleatória de números entre eles.
Squeazer
4
Super! Algum problema ao fazer um normal tempFile.delete()além do deleteOnExit(já que não quero ter hordas de arquivos temporários antes de sair)?
SRobertJames
2
Não, você pode fazer isso de qualquer maneira.
Stefan
1
@SRobertJames: Sem problemas. O fato é que a criação de arquivos temporários com nomes previsíveis impõe problemas de segurança. Depois de criados de forma segura com as permissões adequadas, eles não o fazem.
Markus W Mahlberg
1
Eu não consideraria isso seguro, o arquivo criado é legível por todos e reside no diretório tmp que tende a ser acessível a qualquer usuário.
Peter Gerber
37

Desde o Java 7, existe o novo arquivo API "NIO2" que contém novos métodos para criar arquivos e diretórios temnp. Vejo

por exemplo

Path tempDir = Files.createTempDirectory("tempfiles");

ou

Path tempFile = Files.createTempFile("tempfiles", ".tmp");
Tim Büthe
fonte
1
Eu prefiro NIO, que não requer um prefixo.
Franklin Yu