Androidで一時ファイルを作成する


204

Androidで一時ファイルを作成する最良の方法は何ですか?

File.createTempFileは使用できますか?ドキュメントは非常にあいまいです。

特に、で作成された一時ファイルがいつFile.createTempFile削除されるかは明らかではありません。


一時ファイルが説明されているstackoverflowのこのスレッドから始めることができます。
Benny Skogberg、2010

このAndroidの開発者は、Googleのグループディスカッションが参考になります。groups.google.com/group/android-developers/browse_thread/thread/...
hpique

回答:


286

これは私が通常行うことです:

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

それらの削除についても、私は完全にはわかりません。私はこれをキャッシュの実装で使用しているため、キャッシュディレクトリのサイズがプリセット値になるまで、最も古いファイルを手動で削除します。


2
それも私がやっていることです。私の想定では、キャッシュディレクトリを使用しない限り、createTempFileは実際の一時ファイルを作成しないが、これは実際には文書化されていません。
hpique

他のアプリも実行して独自の一時ファイルを作成した場合でも、アプリが実行されている限りファイルが保持されると想定できますか?
Android開発者

1
すべてのアプリは独自のキャッシュを使用します。デフォルトでは、内部ストレージに保存されたファイルはアプリケーション専用であり、他のアプリケーションはそれらにアクセスできません(ユーザーもアクセスできません)。一部のデータをキャッシュしたい場合は、getCacheDir()を使用して、アプリケーションが一時キャッシュファイルを保存するFileを開く必要があります。デバイスの内部ストレージ容量が少ない場合、Androidはこれらのキャッシュファイルを削除して容量を回復する場合があります。ただし、これらのファイルのクリーンアップをシステムに依存しないでください。 出典
felixd 2013年

共有インテントを使用してこのファイルを共有できますか?
16

4
outputFile.deleteOnExit()を呼び出すことができます。理論的には、システムはアプリの終了時にクリーンアップします。Fileクラスの標準メソッド。
デイブハバード

90

内部および外部の一時ファイルに関するベストプラクティス:

内部キャッシュ

データを永続的に保存するのではなく、キャッシュする場合は、を使用getCacheDir()して、アプリケーションが一時キャッシュファイルを保存する内部ディレクトリを表すFileを開く必要があります。

デバイスの内部ストレージ容量が少ない場合、Androidはこれらのキャッシュファイルを削除して容量を回復する場合があります。ただし、これらのファイルのクリーンアップをシステムに依存しないでください。キャッシュファイルは常に自分で保守し、消費されるスペースの合理的な制限(1MBなど)内に収める必要があります。ユーザーがアプリケーションをアンインストールすると、これらのファイルは削除されます。

外部キャッシュ

キャッシュファイルを保存する外部ストレージディレクトリを表すファイルを開くには、を呼び出しますgetExternalCacheDir()。ユーザーがアプリケーションをアンインストールすると、これらのファイルは自動的に削除されます。

ContextCompat.getExternalFilesDirs()上記のと同様に、を呼び出して、セカンダリ外部ストレージ(使用可能な場合)のキャッシュディレクトリにアクセスすることもできますContextCompat.getExternalCacheDirs()

ヒント:ファイルスペースを維持してアプリのパフォーマンスを維持するには、キャッシュファイルを慎重に管理し、アプリのライフサイクル全体で不要になったキャッシュファイルを削除することが重要です。


2
これは、大きな一時ファイルをどうするかという質問には適切に答えません。ここでのベストプラクティスは何ですか?普通のファイルを単に管理する以外に、それはないと思います。
Merkは

35

一時的な内部ファイルの場合、2つのオプションがあります

1。

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

2。

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

どちらのオプションもアプリケーションキャッシュディレクトリにファイルを追加するため、必要に応じてクリアしてスペースを空けることができますが、オプション1はファイルを一意にするためにファイル名の最後に乱数を追加します。また.tmp、デフォルトのファイル拡張子が追加されますが、2番目のパラメーターを使用して任意に設定できます。乱数の使用は、ファイル名を指定しても、番号がサフィックス/ファイル拡張子(.tmpデフォルトでは)とともに追加されるため、変更されないことを意味します。たとえば、ファイル名をとして指定し、としてinternal_file出力されinternal_file1456345.tmpます。内線番号は指定できますが、追加する番号は指定できません。ただし、生成されたファイル名はfile.getName();ただし、ファイルをどこかに保存して、ファイルの削除や読み取りなど、いつでも使用できるようにする必要があります。したがって、この理由から、指定するファイル名は作成されるファイル名であるため、2番目のオプションを選択します。


2
アプリのプロセスが生きていないときにのみ一時ファイルが削除されると仮定できますか?
Android開発者

2
@androiddeveloper No.
Guilherme Bernal

@GuilhermeBernalどうやってそれを知っていますか?削除されるのを見ましたか?
Android開発者、

1
@androiddeveloper先に詳細を説明しなかったのは申し訳ありません。ユーザーは、アプリを強制終了することなく、アプリを開いて設定に移動し、キャッシュをクリアしてからアプリに戻ることができます。したがって、アプリはキャッシュファイルが削除されないことを想定できず、ユーザーの操作なしにAndroid自体が削除を停止することはありません。
Guilherme Bernal

14

context.getCacheDir()を使用してキャッシュディレクトリを使用できます。

File temp=File.createTempFile("prefix","suffix",context.getCacheDir());

10
ファイルtemp = File.createTempFile( "prefix"、 "suffix"、context.getCacheDir());
Patrick

ありがとう、私はそれをしましたが、私のファイルサイズは0Bです。
user7856586 2018年

1

7
使用されているJVMの奇妙なフレーバーのため、Androidではほとんど役に立たない(ほとんど正常に終了しない)
weaknespase

1
パフォーマンスの問題がない限り、不要になったデータをすぐに削除、解放、または削除します。
Redwolf

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.