Androidのファイルの保存

内部または外部ストレージを選択し

、「内部」と「外部」メモリ:すべてのAndroidデバイスは、2つのファイル記憶領域を持っているため。初期の、デバイスからこれらの名前のほとんどは、Androidは、microSDカード(外部メモリ)等の不揮発性メモリ(内部メモリ)、リムーバブル記憶媒体を内蔵提供します。さて、恒久的に独立したメモリ空間に多くのデバイス「内部」と「外部」のパーティション。このため、リムーバブルストレージメディアずに、両方のストレージスペースは、APIの動作は同じである、着脱可能な外部記憶装置かどうかにかかわらず、常に存在しています。

外部メモリは、取り外し可能であってもよいので、以下に示すように、ので、これら二つのオプションの間にいくつかの違いがあります。
内蔵メモリ:

    それは常に利用可能です。
    内部メモリに保存されたファイルは、あなたのアプリケーションがアクセスすることができます。
    ユーザーがアプリケーションをアンインストールすると、システムは、内部ストレージのアプリケーションからすべてのファイルを削除します。
    あなたはユーザーや他のアプリケーションがファイルにアクセスできないようにしたい場合は、内部ストレージを使用するのが最適です。

外部メモリ:

    ユーザーが外部USBメモリストアとしてマウントされ、いくつかのケースでは装置から取り外すことができるので、外部記憶装置は、常に利用可能ではありません。
    外部ストレージは、あなたのコントロールの外を読むかもしれないので、ここでファイルに保存され、世界的に読み取り可能です。
    ユーザーがアプリケーションをアンインストールすると、のみgetExternalFilesDir()を使用して取得したアプリケーションのディレクトリに格納されているファイル、システムは、ここからアプリケーションのファイルを削除します。
    ファイルのアクセス制限のために、あなたは他のアプリケーションと共有ファイルに必要とするか、またはユーザーが外部ストレージは最高のロケーションであるアクセスするためにコンピュータを使用することはできません。

内部ストレージ内のファイル保存

の特定の場所のAndroidのファイルシステムに指定されているアプリケーションの内部ストレージディレクトリは、アプリケーションのパッケージ名でアクセスするAPIを使用することができます。

    注:外部ストレージディレクトリ異なる、あなたのアプリケーションは、これらのメソッドによって返された内部ディレクトリを読み書きするために、任意のシステム権限を必要としません。

ファイル書き込み

:あなたは内部ストレージにファイルを保存するときに、適切なディレクトリ、さらに操作ファイル、次の2つの方法を呼び出すことによって取得することができる

    getFilesDirを():Fileはアプリケーションの内部ディレクトリを表して返します。
    getCacheDir():ファイルの一時キャッシュファイルは、内部ディレクトリの応用ということを返します。

上記の方法によって提供されるファイル格納ディレクトリに指定されたメソッドの内部に通す、ファイルが使用されるファイル()コンストラクタが可能な新しいディレクトリを作成します。

例:

    ファイルファイル= 新しい新しいファイル(context.getFilesDir()、ファイル名); 
     

代わりに、ファイルのFileOutputStream書かれた内部ディレクトリの内容を取得するためにopenFileOutput()を呼び出すことができます。

例えば、ここにいくつかのテキストファイルの書き込み方法は次のとおりです。

    文字列のファイル名=「myfileのを」;  文字列FILECONTENTS =「こんにちは、世界!」;  のFileOutputStreamのOutputStream; 試し{OutputStreamを=
     
    openFileOutput(ファイル名、Context.MODE_PRIVATE); OutputStream.write(fileContents.getBytes()); outputStream.close();} キャッチ(例外e){e.printStackTrace();} MODE_PRIVATEファイルが作成(または同じで置換されていますファイル名)、およびアプリケーションのプライベートファイルを設定します。その他の利用可能なモードは以下のとおりです。MODE_APPEND、MODE_WORLD_READABLEとMODE_WORLD_WRITEABLEを。このopenFileOutput()メソッドは、ファイルモードパラメータを必要とすることに注意してください。転送MODE_PRIVATEは、ファイルを作成(または同じ名前のファイルを置き換え)、およびプライベートファイルアプリケーションとして設定します。その他の利用可能なモードは以下のとおりです。MODE_APPEND、MODE_WORLD_READABLEとMODE_WORLD_WRITEABLEを。APIレベル17、および定数のでMODE_WORLD_READABLE MODE_WORLD_WRITEABLEは廃止されました。AndroidのN(7.0、API24)を開始し、これらの定数を使用SecurityExceptionをトリガするためにつながります。「:ファイルアンドロイドN以降のアプリケーションのためのこの手段は、共有しようと、名前でプライベートファイルを共有することはできません// 」の原因のURIがFileUriExposedExceptionにつながります。アプリケーションが他のアプリケーションとのプライベートドキュメントを共有する必要がある場合、それはFileProviderはFLAG_GRANT_READ_URI_PERMISSIONと組み合わせて使用することができますAndroidの6.0であなたのファイルモードが世界読めるに設定されている場合(APIレベル23)と下位レベルで、他のアプリケーションは、あなたの内部文書を読むことができます。しかし、他のアプリケーションは、アプリケーションのパッケージ名とファイル名を知っている必要があります。あなたが明示的に読み書きされるファイル、または他のアプリケーションを設定しない限り、限り、あなたはあなたのファイルを格納するために内側にMODE_PRIVATEマークを使用して、そこで・上の他のアプリケーションを社内ディレクトリを参照することはできませんし、パーミッションを読み取りまたは書き込みしません。それらにアクセスすることはできません。キャッシュファイルを書き込み、ファイルをキャッシュする必要がある場合は、あなたがのcreateTempFile()を使用する必要があります。たとえば、次のような方法は、URLからファイル名を抽出すると、アプリケーションのキャッシュディレクトリ内にその名前のファイルを作成します。プライベートファイルgetTempFile(コンテキストコンテキスト、文字列のURL){ファイルファイル、試し{文字列fileNameに= Uri.parse( URL).getLastPathSegment();ファイル= File.createTempFile(ファイル名、ヌル、context.getCacheDir());} キャッチ(IOExceptionをE){ //はファイルの作成中にエラー} リターンをファイル;}のcreateTempFile()を使用して、アプリケーション固有のキャッシュ・ディレクトリ内のファイルを作成します。あなたは、もはや定期的に必要なファイルを削除する必要があります。注:システムメモリは、警告なしにキャッシュされたファイルを削除することができ、低である場合はそう読む前に、ファイルがキャッシュに存在するかどうかを確認してください。既存のファイルを読み取られる既存のファイルを開き、openFileInput(名前)を呼び出し、ファイル名を渡します。あなたは()を呼び出すことによって、すべてのfileListアプリケーションのファイル名の配列を取得することができます。注:あなたがアプリケーションをインストールするときにアクセス可能なファイルをパッケージ化する必要がある場合は、プロジェクトの解像度/生/の中のファイルを保存するディレクトリ。あなたは()openRawResourceを使用してこれらのファイルを開くには、リソースIDを渡すことができます。このメソッドは、メソッドは、ファイルを読み取るために使用することができ返します。あなたは、元のファイルを書き込むことはできません。あなたが内部ファイルシステム上のディレクトリを開くには、次の方法を使用することができ、ディレクトリを開きます。getFilesDir():一意のファイルシステム上のアプリケーションディレクトリに関連付けられているファイルを表して返します。GETDIR(名、モード):新しいディレクトリにアプリケーションのディレクトリに独自のファイルシステムを作成します(または、既存のディレクトリを開きます)。getFilesDirは()を提供するカタログのこの新しいディレクトリ。getCacheDir():ユニークなアプリケーションのキャッシュディレクトリに関連付けられているファイルシステムを表すファイルを返します。これは、定期的に清掃する必要があり、一時ファイルディレクトリに適用されます。ディスクの空き容量が不足している場合、システムがそこにあるファイルを削除することができ、そのファイルは読み取り前にキャッシュ内に存在するかどうかを確認してください。新しいファイルのディレクトリを作成するには、ファイルを提供する上記の方法のいずれかの内部ストレージディレクトリを指定されたオブジェクトを渡すファイル()コンストラクタを使用することができます。たとえば、次のファイルディレクトリ= context.getFilesDir();ファイルファイル= 新しい新ファイル(ディレクトリ、ファイル名);あなたは他のアプリケーションと共有したり、ユーザーがアクセスファイルにコンピュータを使用できるようにするために、外部メモリを使用して外部ストレージファイルに保存されてはいます。文書が他のアプリケーションに利用可能であるべきとのユーザーは無料で:公共ドキュメント:保存し、使用可能なメモリを確認するための許可を要求した後、次の2つの異なる種類のドキュメントを保存することができます。ユーザーがアプリケーションをアンインストールすると、これらの文書は、まだユーザーに利用可能であるべきです。たとえば、アプリケーションやその他のダウンロードファイルキャプチャ写真は公文書として保存する必要があります。プライベート文書:アプリケーションをアンインストールすると、アプリケーション内の法律上のファイルは、ユーザーが削除されます。ユーザおよびアクセスする他のアプリケーションで技術的にこれらのファイルは、それらが外部記憶装置上に配置されているためものの、彼らは外のアプリケーションのユーザーに価値を提供していません。注:SDカードを取り外したり、コンピュータにデバイスを接続する場合は、外部ストレージが使用できなくなることがあります。そしてREAD_EXTERNAL_STORAGE権限を持つユーザーや他のアプリケーションは、まだこれらのファイルを見ることができます。アプリケーションの機能は、これらのファイルに依存して、またはあなたが完全にアクセスを制限する必要がある場合はそのため、あなたは内部ストレージにファイルを書き込む必要があります。リクエスト外部ストレージ共通の外部ストレージへの書き込み権限、マニフェストファイル内WRITE_EXTERNAL_STORAGEの許可を要求する必要があります。<用途許可アンドロイド:名 =「android.permission.WRITE_EXTERNAL_STORAGE」/> アプリケーションがWRITE_EXTERNAL_STORAGE権限を使用している場合は、それも暗黙的に外部記憶装置の読み取り権限を持っています。あなたのアプリケーションは、外部メモリのみ(ただし、書き込み)を読み取る必要がある場合は、宣言READ_EXTERNAL_STORAGE許可する必要があります。<用途許可アンドロイド:名前は =「android.permission.READ_EXTERNAL_STORAGE」/>アンドロイド4.4(APIレベル19)からファイルにアプリケーションや書き込みのプライベートな外部記憶ディレクトリに読み始めた-使用getExternalFilesDir()のアクセスを、あなたはREAD_EXTERNAL_STORAGEまたはWRITE_EXTERNAL_STORAGE許可は必要ありません。お使いのアプリケーションがサポート4.3アンドロイドのであれば、あなただけのアクセス、専用の外部ストレージディレクトリにしたい(APIレベル18)とそれ以前の、そして、あなたは唯一のAndroidの以前のバージョンにmaxSdkVersionプロパティの宣言を追加することにより、許可を要求する必要があります。<uses-アンドロイド許可:名= 「android.permission.WRITE_EXTERNAL_STORAGE」アンドロイド:maxSdkVersion = />「18は」-例えば、ユーザPCの記憶手段は、外部記憶装置を提供することに着脱されたときに外部記憶装置が利用可能でないかもしれないので、外部メモリが利用可能であることを確認しますSDカード- あなたはいつもボリュームを訪問する前に利用可能であることを確認する必要があります。あなたは()を呼び出すことによって、外部ストレージの状態getExternalStorageStateを照会することができます。リターン・ステータスがMEDIA_MOUNTEDある場合は、ファイルを読み書きすることができます。MEDIA_MOUNTED_READ_ONLY場合は、あなただけのファイルを読むことができます。たとえば、以下の方法が使用可能なストレージを決定するために使用することができます:/ * 小切手外部ストレージは、IF読み取りと書き込みのために提供されています* / パブリックブールisExternalStorageWritable(){文字列の状態=Environment.getExternalStorageState(); もし(Environment.MEDIA_MOUNTED.equals(状態)){ 戻り} を返す} / * 外部記憶装置は、少なくともREADに利用可能であるかどうかをチェック* / パブリックブールisExternalStorageReadable(){文字列状態= Environment.getExternalStorageState()。IF(Environment.MEDIA_MOUNTED.equals(状態)|| Environment.MEDIA_MOUNTED_READ_ONLY.equals(状態)){ 戻り} 戻り;} publicディレクトリを外部の一般的な方法に保存されますが、外部ストレージにファイルを保存したい場合は、getExternalStoragePublicDirectoryを(使用)ファイルが外部ストレージに対応するディレクトリことを示して取得します。この方法は、公衆が、他のファイル(例えばDIRECTORY_MUSIC又は)その論理組織DIRECTORY_PICTURESを使用することができるように、保存するファイルの種類を指定するパラメータを受け付けます。たとえば:公共ファイルgetPublicAlbumStorageDir(文字列ALBUMNAMEは){ // 。公共の写真のためのディレクトリユーザーAPOSファイルディレクトリファイル=取得新しい新しいファイル(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)、ALBUMNAME)を、IF(!File.mkdirs()){ Log.e(LOG_TAG、 "ディレクトリが作成されない" );} リターンファイル;あなたは、メディアスキャナで非表示のファイルにしたいの空のファイル.nomediaという名前の外部ファイルのディレクトリが含まれている場合}(ファイル名に接頭辞を注意してください)。これは、他のアプリケーションが利用できるよう、あなたのメディアファイルを読むためにメディアスキャナを防ぎ、およびメディアストアのコンテンツプロバイダによって。あなたは、アプリケーション固有および外部プロバイダでファイルを保存するために、そしてあなたがgetExternalFilesDirを(呼び出して、名前を渡すことができます)あなただけのことで、ディレクトリを取得したい場合は、外部ストレージができないメディアストア訪問の外部プライベートディレクトリに保存しますあなたが入力するディレクトリの名前を示すアプリケーションの使用状況、。このように、それぞれ作成したディレクトリは、親ディレクトリに追加されます、ディレクトリは、アプリケーションのすべての外部ストレージファイルをカプセル化したアプリケーションのアンインストール時に、ユーザー、それが削除されます。公共ファイルgetPrivateAlbumStorageDir(コンテキストコンテキスト、文字列ALBUMNAME){ // アプリケーションAPOSプライベートファイルディレクトリファイル=写真用のディレクトリを取得。新しい新しいファイル(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)、ALBUMNAME); (!IF )(file.mkdirsを) Log.e {(LOG_TAG、「ディレクトリが作成されていない」);} 戻りファイル;}ファイルには事前に定義されたサブディレクトリ名が存在しない場合、あなたは(getExternalFilesDirを呼び出す)と渡すことができヌルをこれは、外部ストレージアプリケーションのプライベートディレクトリにルートディレクトリを返します。ユーザーがアプリケーションディレクトリをアンインストール時に削除作成するには、getExternalFilesDir()を覚えておいてください。ファイルを保存した場合、ユーザはアプリケーションがまだ使用可能であるアンインストール後に-例えば、ときあなたの写真をキャプチャするために、アプリケーションとユーザーがこれらの写真を保持する必要があります- あなたは、共通のディレクトリにファイルを保存する必要があります。外部メモリSDカードスロットも提供されるように、内部パーティションは記憶装置を割り当てるため、時々複数の記憶場所の間で選択します。あなたは「プライベート」のファイルが外部メモリに書き込まれたときに使用するディレクトリを選択する必要があるように、デバイスは、二つの異なる外部ストレージのディレクトリを持っていることをこれが意味。4.4 Androidの各保管場所のエントリを含むファイルの位置配列を返す、)スタート(APIレベル19)、あなたは(呼び出すことによって、2箇所のgetExternalFilesDirsを訪問することができます。配列の最初のエントリは、それが完全または使用できない場合を除き、あなたがこの位置を使用する必要があり、主な外部記憶装置とみなされています。あなたのアプリは、Android 4.3およびそれ以前をサポートしている場合は、静的メソッド)は、ライブラリContextCompat.getExternalFilesDirsを(サポートして使用する必要があります。それだけで一つのメインの外部ストレージのエントリが含まれているので、Androidの中で第二の記憶場所がある場合、することはできません(、それは常にファイルの配列を返しますが、デバイスは、Android 4.3を実行して、以前されている場合40.3およびそれ以前のアクセスその上)。あなたは常に削除ファイルの削除ファイルは、アプリケーションはもはや必要とされません必要があります。ファイルを削除するための最も直接的な方法は、Fileオブジェクトdelete()メソッドを呼び出すことです。myFile.delete();ファイルは内部メモリに保存されている場合、あなたはまた、()のDELETEFILEコンテキストを呼び出してファイルを検索し、削除することができますmyContext.deleteFile(fileNameに);注:あなたはあなたのアプリケーション、Androidシステムをアンインストールします以下を削除する:あなたは内部メモリーに保存されているすべてのファイル。使用getExternalFilesDir()すべてのファイルの外部記憶装置には、しかし、あなたはすべて手動でキャッシュファイルを作成するために、定期的にgetCacheDir()を削除し、他の文書する必要があり、定期的に不要になった削除されます。Androidのカタログの概要($ ROOTDIR)+ - /データ- > Environment.getDataDirectory()| | | | ($ appDataDir)| + -データ/ com.srain.cube.sample | | | | ($ FILESDIR)| + -ファイル- > Context.getFilesDir()/ Context.getFileStreamPath( "" )| | | | | + -ファイル1 - > Context.getFileStreamPath( "FILE1" )| | ($示すcacheDirがある)| + -キャッシュ- > Context.getCacheDir() | | | + -がapp_ $名- >(Context.getDir(文字列名、int型MODE)| |($ ROOTDIR)+ - /ストレージ/ sdcard0 - > Environment.getExternalStorageDirectory()| / Environment.getExternalStoragePublicDirectory( "" )| + - DIR1 - > Environment.getExternalStoragePublicDirectory( "DIR1" )| | ($ appDataDir)+ - Andorid /データ/ com.srain.cube.sample | | ($ FILESDIR)+ -ファイル- > Context.getExternalFilesDir( "" )| | | + -ファイル1 - > Context.getExternalFilesDir( "FILE1" )| + -ミュージック- > Context.getExternalFilesDir(Environment.Music)。| + -ピクチャー- > ... Environment.Picture | + - ... | | ($示すcacheDir)+ -キャッシュ- > Context.getExternalCacheDir()| + - ???

おすすめ

転載: www.cnblogs.com/Free-Thinker/p/11937620.html