Criando arquivos temporários no Android

204

Qual é a melhor maneira de criar um arquivo temporário no Android?

File.createTempFile pode ser usado? A documentação é muito vaga sobre isso.

Em particular, não está claro quando os arquivos temporários criados com File.createTempFilesão excluídos, se for o caso.

hpique
fonte
Você pode começar com esse encadeamento no stackoverflow, onde os arquivos temporários são discutidos.
Benny Skogberg
Este grupo de discussão Android Developers Google pode ser de interesse: groups.google.com/group/android-developers/browse_thread/thread/...
hpique

Respostas:

286

Isto é o que eu normalmente faço:

File outputDir = context.getCacheDir(); // context being the Activity pointer
File outputFile = File.createTempFile("prefix", "extension", outputDir);

Quanto à sua exclusão, também não tenho certeza. Como eu uso isso na minha implementação de um cache, excluo manualmente os arquivos mais antigos até que o tamanho do diretório de cache se reduz ao meu valor predefinido.

sparkymat
fonte
2
É o que eu faço também. Minha suposição é que createTempFile não cria arquivos temporários reais, a menos que ele use o diretório de cache, mas isso não está realmente documentado.
Hpique
posso assumir que o arquivo permanecerá enquanto o aplicativo estiver sendo executado, mesmo que outros aplicativos também sejam executados e criem seus próprios arquivos temporários?
desenvolvedor android
1
Todo aplicativo usa seu próprio cache: por padrão, os arquivos salvos no armazenamento interno são particulares ao seu aplicativo e outros aplicativos não podem acessá-los (nem o usuário). Se você deseja armazenar em cache alguns dados, use getCacheDir () para abrir um arquivo em que seu aplicativo salve arquivos de cache temporários. Quando o dispositivo está com pouco espaço de armazenamento interno, o Android pode excluir esses arquivos de cache para recuperar espaço. No entanto, você não deve confiar no sistema para limpar esses arquivos para você. Fonte
felixd 22/10
Posso usar a intenção de compartilhar para compartilhar este arquivo?
aks
4
Você pode chamar outputFile.deleteOnExit (). Em teoria, o sistema irá limpá-lo quando o aplicativo sair. Método padrão na classe File.
Dave Hubbard
90

Práticas recomendadas em arquivos temporários internos e externos :

Cache interno

Se você deseja armazenar em cache alguns dados, em vez de armazená-los persistentemente, use getCacheDir()um arquivo que represente o diretório interno onde seu aplicativo deve salvar arquivos temporários em cache.

Quando o dispositivo está com pouco espaço de armazenamento interno, o Android pode excluir esses arquivos de cache para recuperar espaço. No entanto, você não deve confiar no sistema para limpar esses arquivos para você. Você deve sempre manter os arquivos de cache e manter-se dentro de um limite razoável de espaço consumido, como 1 MB. Quando o usuário desinstala seu aplicativo, esses arquivos são removidos.

Cache externo

Para abrir um arquivo que representa o diretório de armazenamento externo em que você deve salvar os arquivos de cache, ligue getExternalCacheDir(). Se o usuário desinstalar seu aplicativo, esses arquivos serão excluídos automaticamente.

Semelhante ao ContextCompat.getExternalFilesDirs()mencionado acima, você também pode acessar um diretório de cache em um armazenamento externo secundário (se disponível) chamando ContextCompat.getExternalCacheDirs().

Dica: para preservar o espaço no arquivo e manter o desempenho do seu aplicativo, é importante que você gerencie cuidadosamente seus arquivos de cache e remova aqueles que não são mais necessários ao longo do ciclo de vida do seu aplicativo.

mibollma
fonte
2
Isso não responde adequadamente à pergunta sobre o que fazer com arquivos temporários grandes. Qual é a melhor prática aqui? Eu suspeito que não há um, além de simplesmente gerenciar um arquivo normal.
Merk
35

Para arquivos internos temporários, são duas opções

1

File file; 
file = File.createTempFile(filename, null, this.getCacheDir());

2)

File file
file = new File(this.getCacheDir(), filename);

Ambas as opções adicionam arquivos no diretório de cache dos aplicativos e, portanto, podem ser limpas para liberar espaço conforme necessário, mas a opção 1 adicionará um número aleatório no final do nome do arquivo para manter os arquivos exclusivos. Ele também adicionará uma extensão de arquivo que, .tmppor padrão, pode ser configurada para qualquer coisa através do uso do segundo parâmetro. O uso do número aleatório significa que, apesar de especificar um nome de arquivo, ele não permanece o mesmo, pois o número é adicionado juntamente com a extensão de sufixo / arquivo ( .tmppor padrão). Por exemplo, você especifica seu nome de arquivo comointernal_file e sai comointernal_file1456345.tmp . Considerando que você pode especificar a extensão, não pode especificar o número que é adicionado. No entanto, você pode encontrar o nome do arquivo gerado por meio defile.getName();, mas você precisará armazená-lo em algum lugar para poder usá-lo sempre que desejar, por exemplo, para excluir ou ler o arquivo. Portanto, por esse motivo, prefiro a segunda opção, pois o nome do arquivo especificado é o nome do arquivo criado.

AdrenalineJunky
fonte
2
Posso assumir que os arquivos temporários serão excluídos apenas quando o processo do aplicativo não estiver ativo?
desenvolvedor android
2
@androiddeveloper No.
Guilherme Bernal
@GuilhermeBernal Como você sabe disso? Você já viu isso sendo excluído?
desenvolvedor android
1
@androiddeveloper Desculpe por não fornecer detalhes antes. Um usuário pode abrir o aplicativo, acessar as configurações, limpar seu cache e voltar ao aplicativo, tudo sem que ele seja morto. Portanto, um aplicativo não pode assumir que o arquivo de cache não será excluído e nada impede o próprio Android de fazê-lo sem a interação do usuário.
Guilherme Bernal
14

Você pode usar o diretório de cache usando context.getCacheDir () .

File temp=File.createTempFile("prefix","suffix",context.getCacheDir());
Macarse
fonte
10
Arquivo temp = File.createTempFile ("prefixo", "sufixo", context.getCacheDir ());
284 Patrick
Obrigado, eu fiz, mas o tamanho do meu arquivo é igual a 0B, onde está o problema, alguma idéia?
user7856586
1

Você pode usar o File.deleteOnExit()método

https://developer.android.com/reference/java/io/File.html#deleteOnExit ()

É referenciado aqui https://developer.android.com/reference/java/io/File.html#createTempFile(java.lang.String , java.lang.String, java.io.File)

kotucz
fonte
7
É praticamente inútil no Android devido ao sabor estranho da JVM utilizado (É quase nunca terminar normalmente)
weaknespase
1
Desde que não haja problemas de desempenho, exclua, libere ou descarte dados imediatamente, quando você não precisar mais deles.
RedWolf
0

Faça isso de maneira simples. De acordo com a documentação https://developer.android.com/training/data-storage/files

String imageName = "IMG_" + String.valueOf(System.currentTimeMillis()) +".jpg";
        picFile = new File(ProfileActivity.this.getCacheDir(),imageName);

e exclua-o após o uso

picFile.delete()
Shivam Dawar
fonte