web-dev-qa-db-ja.com

File.createTempFile()VS new File()

私のアプリでは、Fragmentで表される毎日の写真を追加して保存する機能を追加しました。

SDカードに写真を保存するために、現在File.createTempFile関数を使用しています:

File imageFile = File.createTempFile(imageFileName, MyApplication.JPEG_FILE_SUFFIX, MyApplication.getAlbumDir());

私も実際に標準的な方法で試しました:

File imageFile = new File(MyApplication.getAlbumDir(), imageFileName + MyApplication.JPEG_FILE_SUFFIX);

両方とも機能していますが、私の場合、関数createTempFileがファイル名の末尾に長い乱数を追加して一意にするため、最初の方が2番目の方が優れています。

例として、両方の方法で得られるものを次に示します。

createTempFileIMG_2013-06-18_-1961144729.jpgを使用

新しいファイルIMG_2013-06-18_.jpg

最後に私の質問は、createTempFileを使用して写真を保存しても安全ですか、それとも標準的な方法を使用してコードを追加して一意のファイル名を生成する必要がありますか?一時ファイルにのみ使用する必要がありますか?

関数に関するドキュメントを確認しましたが、new Fileの代わりに関数を使用した場合に考えられる結果については何も見つかりませんでした。

ありがとうございました

47
Yoann Hercouet

アプリがファイルを作成しているように聞こえるので、一意のファイル名を保証する必要があります。アプリ内に何らかの種類のカウンターを保持し(設定またはDBに保存)、それを使用できます。次に、より短い/より制御された名前を作成し、独自性を制御できます。または、createTempFile()を使用して、一意のファイル名を取得することができます(ただし、ファイル名の部分的な制御のみを取得します)。 createTempFile()を好むように聞こえるので、生成するファイル名に満足している場合は、使用を継続しない理由はありません。ファイル名の形式を完全に制御できないこと以外に欠点はありません。

22
user1676075

一時的な内部ファイルの場合、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番目のオプションを選択します。

19
AdrenalineJunky

1。ランダムな名前でファイルを作成します

File file = File.createTempFile(String prefix, String suffix, File parent)
  • 実際にディスク上にファイルを作成し、ファイルオブジェクトを返します
  • 次の形式でファイル名を作成します:プレフィックス+乱数+サフィックス
  • ディスク上に一時ファイルを作成する必要がある場合に役立ちます

2。正確な名前でファイルを作成する

File file = new File(File parent, String child);
file.createNewFile();
  • 実際にディスク上にファイルを作成し、ファイルが正常に作成されるとtrueを返します

  • ファイル名は、子パラメーターに正確に渡されます

  • ディスク上に永続的なファイルを作成する必要がある場合に役立ちます

3。 (メモリ内に)ファイルオブジェクトのみを作成します

File file = new File(File parent, String child);
// doesn't create the file on disk until calling createNewFile() method
  • 実際にディスク上ではなく、メモリ内のみを作成します
  • ファイルオブジェクトを作成するだけの場合に便利です(たとえば、パラメータとして渡すだけ)

parentパラメーターは次のいずれかです:

  1. アプリのプライベートディレクトリ

    • context.getCacheDir()
    • context.getExternalCacheDir()
    • そして...(完全なリストは here にあります)
  2. パブリックディレクトリ

    • Environment.getExternalStorageDirectory()
    • Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
    • そして...(完全なリストは here にあります)
18