Androidファイルストレージを完全に理解する---内部ストレージ、外部ストレージ、およびさまざまなストレージパスソリューション



Completely Understand Android File Storage Internal Storage



序文:

PC側のアプリケーションであろうとAndroidアプリケーションであろうと、どのアプリケーションでも、ストレージは間違いなく不可欠です。 Android開発をしている多くの学生にとって、ファイルストレージは非常に単純であると考えられるかもしれません。 getFilesDirやgetExternalStorageDirectoryなどの一部のメソッドが呼び出されますが、対応するメソッドを呼び出して単純なデータストレージを実装します。しかし、彼らは必ずしも彼のデータがどこにあるのか、彼のデータが適切に配置されているのか、それともバージョン互換性があるのか​​を理解しているわけではありません。以下に、これらの場所からの一般的な混乱に答えます。
1、Android内部ストレージ、外部ストレージの概念
2、異なるAndroidバージョンのgetDataDirectory、getFilesDir、getCacheDir、getDir、getExternalStorageDirectory、getExternalStoragePublicDirectory、getExternalFilesDir、getExternalCacheDir、getExternalCacheDir、getRootDirectory、およびその他の違いと連絡方法
3、データをクリアし、最後にどのデータがクリアされるかキャッシュをクリアします
4、/ storage / sdcard、/ sdcard、/ mnt / sdcard、/ storage / emulated / 0の関係
5、RAM、Rom、および拡張ストレージ(TFカード)の内部ストレージの違い、外部ストレージの違いを理解するための図。



まず、Androidの内部ストレージの概念、外部ストレージ

内部記憶装置
概念:内部ストレージはメモリではないことに注意してください。内部ストレージは、システムの特別な場所にあります。ファイルを内部ストレージに保存する場合、ファイルにはデフォルトでアプリケーションからのみアクセスでき、アプリケーションによって作成されるすべてのファイルはアプリケーションパッケージ名と同じです。内容の下。これは、アプリケーションが内部に保存され、アプリケーションに関連付けられているファイルを作成することを意味します。アプリケーションがアンインストールされると、内部ストレージ内のこれらのファイルも削除されます。技術的に言えば、内部ストレージファイルを作成するときにファイルプロパティを読み取り可能に設定すると、ファイルのプロパティがプライベート(プライベート)の場合、他のアプリはアプリケーションのパッケージ名を知っていれば、アプリケーションのデータにアクセスできます。 )、パッケージ名を知っていても、他のアプリケーションにアクセスすることはできません。内部の収納スペースは非常に限られているので、貴重です。さらに、システム自体とシステムアプリケーションの主要なデータ保存場所でもあります。内部の収納スペースがなくなると、携帯電話は使用できなくなります。したがって、内部ストレージスペースについては、使用しないようにする必要があります。 SharedPreferencesデータベースとSQLiteデータベースの両方が内部ストレージに保存されます。内部ストレージは通常、Contextを使用して取得および操作されます。
内部ストレージのAPIメソッドにアクセスします。
1、Environment.getDataDirectory()
2、getFilesDir()。getAbsolutePath()
3、getCacheDir()。getAbsolutePath()
4、getDir(“ myFile”、MODE_PRIVATE).getAbsolutePath()
外部記憶装置
コンセプト:古いAndroidシステムは新しいAndroidシステムとは異なるため、最も混乱するのは外部ストレージです。多くの人がオンラインで情報を見つけ、以前のデータを調べています。現在の情報を調べたところ、違いがあり混乱していた。まず、共通の概念について話しましょう。 「PCの外部ストレージと内部ストレージを区別する場合、コンピューターに付属のハードディスクは内部ストレージであり、USBフラッシュドライブまたはモバイルハードディスクは外部ストレージです。」非常に多くの人々がこの理解をもたらします。 Androidスマートフォン、内蔵ストレージ(本体ストレージ)を内部ストレージ、拡張SDカードを外部ストレージとして見てください。 4.4(API19)より前の携帯電話に当てはまるので、これは本当に当てはまります。電話機自体が搭載しているメモリカードは内部ストレージであり、拡張SDカードは外部ストレージです。ただし、4.4システム以降、多くのミッドエンドからハイエンドのマシンは、独自のボディストレージを8G以上に拡張しています。たとえば、一部の人の携帯電話は16Gであり、一部の人の携帯電話は32Gですが、この16G、32Gは内部にあります。いいえ、保管してください。 ! !これらは依然として外部ストレージです。つまり、4.4システム以降の携帯電話ストレージストレージ(携帯電話自体のストレージはボディストレージと呼ばれます)は、概念的に「内部ストレージ内部」と「外部ストレージ外部」に分けられます。 。 16Gと32Gは外部ストレージであるため、疑問を持つ人もいます。 4.4システム以降がSDカードに接続されている場合、SDカードとは何ですか? SDカードも外部に保存されている場合、本体ストレージを区別するにはどうすればよいですか? SDカードの外部ストレージと外部ストレージ?はい、SDカードは外部ストレージでもあるため、それを区別する方法として、4.4以降のシステムでは、APIは電話の外部ストレージパスをトラバースするためのそのようなメソッドを提供します。



File[] files if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { files = getExternalFilesDirs(Environment.MEDIA_MOUNTED) for(File file:files){ Log.e('main',file) } }

携帯電話がSDカードに接続されている場合、印刷する方法は2つあります。たとえば、私のHuawei Glory7にはSDカードが挿入されています。結果は次のとおりです。
/ storage / emulated / 0 / Android / data / packname / files / Mounted
/ storage / B3E4-1711 / Android / data / packname / files / Mounted
ここで、/ storage / emulated / 0ディレクトリは、本体ストレージの外部ストレージパスです。
/ storage / B3E4-1711 /はSDカードのパスです
それらはまとめて外部ストレージと呼ばれます
外部ストレージにアクセスするためのAPIメソッド:
1、Environment.getExternalStorageDirectory()。GetAbsolutePath()
2、Environment.getExternalStoragePublicDirectory(“”)。GetAbsolutePath()
3、getExternalFilesDir(“”)。GetAbsolutePath()
4、getExternalCacheDir()。GetAbsolutePath()
誰もがAndroidの外部ストレージについて疑問を持っています。主な理由は、多くの携帯電話が外部ストレージを物理的に認識していないことです。以前の携帯電話には、同じ種類の黒いメモリカード、8G、16G、32Gがあります。これは、Uディスクのプラグを抜き差ししたようなものです。かつてはとても人気がありました。収納容量が足りない場合はメモリーカードを購入します(正確にはSDカードで、メモリーカードの誤解と言われています)。その後、たとえば携帯電話でHuawei glory 7を使用するようになりました。メーカーは胴体ストレージを16Gに拡張しましたが、ストレージの概念は内部ストレージ(内部内部)と外部ストレージ(外部外部)に分かれています。統合されています。もちろん、16Gでは不十分だと思われる場合、SDカードを挿入して容量を拡張することをサポートしていますか?サポートされている、例として栄光7、それはスリーインツーカードスロットです。カードスロット1:Nano SIMカードカードスロット2:NanoSIMカードまたはMicroSDカード。デフォルトのカードスロット1は4Gメインカードです。設定で4Gメインカードスロットを変更できます。ホットスワップはサポートしていません。カードを抜き差しした後、電話を再起動する必要があります。このように挿入されたSDカードも外部に保存されます。したがって、電話機の外部ストレージには2つの部分が含まれる場合があります。1つは本体ストレージの外部ストレージ部分で、もう1つはSDカード部分です。

次に、AndroidバージョンのgetDataDirectory、getFilesDir、getCacheDir、getDir、getExternalStorageDirectory、getExternalStoragePublicDirectory、getExternalFilesDir、getExternalCacheDir、getExternalCacheDir、getRootDirectoryの違い

これらの方法は、以前に会ったことがあるかもしれませんが、一部の学生にとっては、主にAndroidのさまざまなバージョンの問題を区別するのが困難です。皆様のご理解を深めるために、上記の方法を簡単にご紹介します。皆の便宜のために、これらの方法の結果を印刷します(以下の印刷結果はGlory 7(システムバージョン6.0)に基づいています:
1、Environment.getDataDirectory()= / data
この方法は、内部ストレージのルートパスを取得するためのものです
2、getFilesDir()。getAbsolutePath()= / data / user / 0 / packname / files
この方法は、内部ストレージ内のアプリケーションのファイルパスを取得するためのものです。
3、getCacheDir()。getAbsolutePath()= / data / user / 0 / packname / cache
この方法は、内部ストレージ内のアプリケーションのキャッシュパスを取得するためのものです。
4、getDir(“ myFile”、MODE_PRIVATE).getAbsolutePath()= / data / user / 0 / packname / app_myFile
このメソッドは、内部ストレージ内のアプリケーションのカスタムパスを取得するためのものです
メソッド2、3、および4のパスにはすべてパッケージ名があり、アプリケーションに属していることを示しています。
…………………………………………………………………………………………
5、Environment.getExternalStorageDirectory()。getAbsolutePath()= / storage / emulated / 0
この方法は、外部ストレージのルートパスを取得するためのものです
6、Environment.getExternalStoragePublicDirectory(“”)。getAbsolutePath()= / storage / emulated / 0
この方法は、外部ストレージのルートパスを取得するためのものです
7、getExternalFilesDir(“”)。getAbsolutePath()= / storage / emulated / 0 / Android / data / packname / files
この方法は、外部ストレージ内のアプリケーションのファイルパスを取得するためのものです。
8、getExternalCacheDir()。getAbsolutePath()= / storage / emulated / 0 / Android / data / packname / cache
この方法は、外部ストレージ内のアプリケーションのキャッシュパスを取得するためのものです。
注意: 4.4より前のシステムでgetExternalFilesDir( '')およびgetExternalCacheDir()の場合、メソッド7およびメソッド8はnullを返します。システムが4.4以上の場合、上記の結果が返されます。つまり、4.4より前のシステムはSDカードに挿入されません。外部ストレージがない場合、そのSDカードは外部ストレージと同等であり、4.4以降のシステム外部ストレージは、getExternalFilesDir( '')とgetExternalCacheDir()の2つの部分で構成され、本体ストレージの外部ストレージ部分、つまり4.4以降を取得します。システムでは、SDカードを挿入せず、外部ストレージもあります。getExternalFilesDir( '')とgetExternalCacheDir()は、本体ストレージの外部ストレージ部分、SDカードのストレージパスを取得する方法、または上記のgetExternalFilesDirs(Environment.MEDIA_MOUNTED)メソッドが取得されます。 AndroidがSDカードのストレージパスを取得するための関連するAPIインターフェースを提供しているかどうかはわかりません。データを確認できます。上記の言葉を繰り返しましたが、主にAndroidのバージョンの違いに注意を払うように全員に思い出させるために、これが最も落とし穴です。
…………………………………………………………………………………………
Environment.getDownloadCacheDirectory()= / cache
Environment.getRootDirectory()= /システム
これらの2つの方法は言うまでもありません、Androidシステムの各バージョンは同じです
…………………………………………………………………………………………
上記から、上記の方法は3つのカテゴリに分類できることがはっきりとわかります。私は、それらを水平線で区切りました。最初のクラスはルートディレクトリ/ dataにあり、ルートディレクトリ/ storageにもクラスがあります。それらを呼び出すAPIメソッドには外部があり、他のクラスは/ data、/ Storage、Forの下にありません。たとえば、システムファイル/ system、またはキャッシュファイル/ cache。
/ dataディレクトリ内のファイルは、通常内部ストレージと呼ばれるものに物理的に保存されます。
/ storageディレクトリ内のファイルは、通常外部ストレージと呼ばれるものに物理的に保存されます。
/ systemはシステムファイルの保存に使用され、/ cacheは一部のキャッシュファイルの保存に使用され、物理的には内部ストレージにも保存されます。
みんなからのよくある質問を見てみましょう。
質問1、getFilesDir()。getAbsolutePath()とgetCacheDir()。getAbsolutePath()の違いは何ですか?
違いはありません。次の図を見ることができます。
画像
getFilesDirはファイルディレクトリを取得し、getCacheDirはキャッシュディレクトリを取得します。これらは同じディレクトリにあり、さまざまな種類のデータを保存するためだけに、ファイル名を確認するのは難しくありません。cacheキャッシュされたデータを保存し、SQLiteに保存されたデータをデータベースを作成し、通常のデータ(ログデータ、jsonタイプのデータなど)をファイルに保存し、SharedPreferenceによって保存されたデータをshared_prefsに保存します。これらのフォルダはシステムによって作成されます。
質問2、getFilesDir()。getAbsolutePath()とgetExternalFilesDir( '')。getAbsolutePath()の違いは何ですか?
最初に彼らの道を見てみましょう:
/ data / user / 0 / packname / files
/ storage / emulated / 0 / Android / data / packname / files
明らかに、この2つの違いは、内部ストレージと外部ストレージの違いです。これが違いです。それらに共通しているのは、パスにパッケージ名が付いていることです。これは、それがAPPの専有ファイルであることを示しています。このようなファイルは、アプリのアンインストールと一緒に削除する必要があり、設定でアプリケーションのデータを削除します。両方のフォルダのデータが消去されます。
質問3、APP固有のドキュメントとは何ですか?
上記の質問2で、排他ファイルについて説明しました。いわゆる排他ファイルは、特定のアプリケーションに属し、APPがアンインストールされると、ファイルパスに対応するパッケージ名が付けられ、アプリケーションとともに削除されます。設定でアプリケーションデータを手動でクリアすると(キャッシュをクリアしない)、それらも一緒にクリアされます。この独自のファイルをAndroidに使用する目的は、ファイル管理を容易にし、面倒なファイルのランダムな保存を回避することです。もう1つの目的は、アプリケーションのアンインストール時に大量のジャンクファイルを残さないようにすることです。
質問4.内部ストレージと外部ストレージの両方にAPP固有のファイルがあるので、どちらを使用する必要がありますか?
内部ストレージと外部ストレージの両方にAPP固有のファイルがあります。どちらを使うべきですか?明らかに、内部ストレージ自体は比較的小さく、一部のシステムは保存されているため、外部ストレージを使用する必要があります。ファイルなので、内部ストレージは使用しないようにしています。ただし、電話に外部ストレージがない場合でも、内部ストレージを使用する必要があります。一般に、プログラマーは外部ストレージがあるかどうか、内部ストレージがないかどうかを判断します。コードは次のとおりです。



public static String getFilePath(Context context,String dir) { String directoryPath='' If (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ) {/ / Determine if external storage is available directoryPath =context.getExternalFilesDir(dir).getAbsolutePath() }else{//Use internal storage without external storage directoryPath=context.getFilesDir()+File.separator+dir } File file = new File(directoryPath) If(!file.exists()){//determines whether the file directory exists file.mkdirs() } return directoryPath }

Androidシステムの異なるバージョン間のストレージの違いを誰もがよりよく理解できるようにするために、次の説明表を作成しました。
19.48MデータをgetFilesDir()。getAbsolutePath()パスとgetExternalFilesDir( '')。getAbsolutePath()パスに書き込む前と後の違いを比較します。
表1、4.1.1 SDカードを搭載したシステム(実機)

ストレージの場所 パスを取得する方法 容量(書き込み前) 容量(書き込み後) 備考
/ data / data / packname / files getFilesDir() 1.59GB 1.57GB 内部記憶装置
/storage/sdcard0 getExternal
StorageDirectory()
1.47GB 1.45GB 外部ストレージ(SDカード)

表2、4.1.1システム、SDカードなし(実機)

ストレージの場所 パスを取得する方法 容量(書き込み前) 容量(書き込み後) 備考
/ data / data / packname / files getFilesDir() 1.59GB 1.47GB 内部記憶装置
パスが存在しません getExternal
StorageDirectory()
~~~ ~~~ SDカードが挿入されていません

表3、4.2.1 SDカードを搭載したシステム(シミュレーター)

ストレージの場所 パスを取得する方法 容量(書き込み前) 容量(書き込み後) 備考
/ data / data / packname / files getFilesDir() 1.85GB 1.83GB 内部記憶装置
/ mnt / sdcard / getExternal
StorageDirectory()
98.42MB 78.93MB 外部ストレージ(SDカード)

表4、4.4.2 SDカードを搭載したシステム(実機)

ストレージの場所 パスを取得する方法 容量(書き込み前) 容量(書き込み後) 備考
/ data / data / packname / files getFilesDir() 2.22GB 2.18GB 内部記憶装置
/storage/sdcard1 getExternal
StorageDirectory()
2.20GB 2.16GB 外部記憶装置
/ storage / emulated / 0 / Android
/ data / packname / files
getExternalFilesDirs 1.47GB 1.47GB 外部ストレージ(SDカード)
それにデータを書き込みませんでした、ただ読んでください)

表5、4.4.2システム、SDカードなし(実機)

ストレージの場所 パスを取得する方法 容量(書き込み前) 容量(書き込み後) 備考
/ data / data / packname / files getFilesDir() 2.22GB 2.18GB 内部記憶装置
/ storage / emulated / 0 getExternal
StorageDirectory()
2.20GB 2.16GB 外部記憶装置

表6、SDカードを備えた6.0.0システム(実機)

ストレージの場所 パスを取得する方法 容量(書き込み前) 容量(書き込み後) 備考
/ data / user / 0 / packname / files getFilesDir() 11.94GB 11.90GB 内部記憶装置
/ storage / B3E4-1711 getExternal
StorageDirectory()
11.92GB 11.88GB 外部記憶装置
/ storage / emulated / 0 / Android
/ data / packname / files
getExternalFilesDirs 1.47GB 1.47GB 外部ストレージ(SDカード)
それにデータを書き込みませんでした、ただ読んでください

表VII、6.0.0システム、SDカードなし(実機)

ストレージの場所 パスを取得する方法 容量(書き込み前) / storage / capacity(書き込み後) 備考
/ data / user / 0 / packname / files getFilesDir() 11.93GB 11.89GB 内部記憶装置
/ storage / emulated / 0 getExternal
StorageDirectory()
11.91GB 11.87GB 外部記憶装置

注:上記の容量は、パスのルートパスの使用可能な容量を示しています。たとえば、/ data / data / packname / filesの容量は、/ dataの使用可能な容量を示し、/ storage / sdcard0 / Android / data / packname / filesは、/ storage / sdcard0の使用可能な容量を示し、通常、4.4のシステムでは以上、SDを運用することはめったにありません

第三に、データをクリアし、最後にどのデータがクリアされるかをキャッシュをクリアします

これは混乱しやすいです、なぜですか?上記を通して、私たちは知っています:
/ data / user / 0 / packname / files通常のデータを保存するために使用されます。
/ data / user / 0 / packname / cacheキャッシュされたデータを保存するために使用されます。
多くの人が、私がデータをクリアすると、それは間違いなくファイルの下のデータだと思います。キャッシュされたデータをクリアすると、間違いなくキャッシュの下のデータになりますが、そうではありません。正しいはずです:
キャッシュの消去 :アプリケーションは、プログラムの読み取り、計算、入出力など、実行中のプロセス中に多くのプロセスを実行する必要があることを知っています。これらのプロセスは間違いなく大量のデータを生成し、メモリ内にあり、次の場合に呼び出されます。プログラムが実行されています。したがって、キャッシュをクリアすると、APPの実行中に生成された一時データがクリアされます。
明確なデータ :データのクリアは、ファイルに保存したデータの実際の削除です(手動で削除しない場合、永続データはファイルに保存されます)。たとえば、設定でアプリケーションのデータをクリアすると、/ data / user / 0 / packname /および/ storage / emulated / 0 / Android / data / packname /のデータ(キャッシュ、ファイルを含む)が削除されます、lib、shared_prefsなど。

第四に、/ storage / sdcard、/ sdcard、/ mnt / sdcard、/ storage / emulated / 0の間の関係

上記の表から、4.1システムでは、getExternalStorageDirectoryメソッドによって取得されたパスは/ storage / sdcard0であることがわかります。これは、4.2システムではgetExternalStorageDirectoryメソッドによって取得されたパスが/ mnt / sdcardであるためです。シミュレーター印刷。実機の場合は、4.4のgetExternalStorageDirectoryメソッドで取得したパスも/ storage / sdcard0、/ storage / emulated / 0、SDカードのストレージパスは/ storage / sdcard1、6.0のgetExternalStorageDirectoryメソッドで取得したパスです。は/ storage / emulated / 0であり、そのSDカードストレージパスは/ storage / B3E4-1711です。さらに、4.0でgetExternalStorageDirectoryメソッドをテストして取得したパスは/ mnt / sdcardです。したがって、実際のマシンでは、getExternalStorageDirectoryによって取得されたパスを次の表に示します。

システムバージョン 結果
4.0 4.0 / mnt / sdcard
4.1 / storage / sdcard0
4.2 / storage / sdcard0
4.4 / storage / emulated / 0
6.0 / storage / emulated / 0

/ storage / sdcard、/ sdcard、/ mnt / sdcard、/ storage / emulated / 0の関係を理解するには、最初にLinuxファイルマウントの概念を理解する必要があります。マウントでBaiduにアクセスできます。また、/ storage / sdcard、/ sdcard、/ mnt / sdcard、/ storage / emulated / 0のようなディレクトリが非常に多く、人々を眩惑させている理由がわかりません。詳細については、以下の記事を注意深くお読みください。記事は私からのものです。 アンドロイド4.2の0フォルダの詳細な説明
-アンドロイド4.0-
ギャラクシーネクサス(GN)電話のuserdataパーティションは非常に大きく、/ dataディレクトリにハングアップしています。ユーザーのデータは通常SDカードに配置されますが、gnにはSDカードがないため、Googleが考えた方法は仮想カードです。
そのため、userdataパーティションにはmediaというディレクトリがあります。これは、組み込みのsdカードのデータ保存場所です。ヒューズテクノロジーを使用して、/ data / mediaを/ dev / fuseというデバイスに仮想化します。プログラムに認識させるために、同時に/ mnt / sdcardディレクトリにマウントし、前のプログラムとの互換性を保つために、ショートカットを作成します(Linuxシステムではソフト接続と呼ばれます)/ sdcardポイント/ mnt / sdcardに。
もちろん、これらはすべて4.0のプラクティスです。
-アンドロイド4.1-
4.1では、ヒューズ技術も使用されます。 / dev / fuseは同時に/ storage / sdcard0ディレクトリにマウントされます。このsdcard0は最初のsdカードを示し(外部Sdカードがある場合、私のxoomなどの/ storage / sdcard1がもう1つあります)、/ sdcardソフト接続は/ storage / sdcard0を指し、/ mnt / sdcardはまた、ソフト接続は、/ storage / sdcard0を指します。
otgラインを介してUディスクを接続すると、/ storage / usb0ディレクトリにマウントされます。 Stickmountソフトウェアは、ライブラリ、クイックマップ、mxプレーヤー、その他のソフトウェアのuディスクを表示できます。その中のデータは/ storage / sdcard0 / usStorage / sda1にもマウントされます。
たぶんあなたは尋ねるでしょう、なぜusb0ではなく、sda1、これはハードディスクに名前を付けるLinuxの方法です、あなたのuディスクが複数のパーティションを持っているなら、それはsda1、sda2ですそれは排出されました。
-アンドロイド4.2-
では、4.2システムから始めましょう。
グーグルは大丈夫ではありません、あなたはアンドロイドにマルチユーザーを与えなければなりません、あなたはそれについて考えます、中国では、おそらく経済問題のために、家族は一人当たりのコンピュータではありません、米国では、ほとんどコンピュータを必要とする人々はそれらは1台以上あり、1台のコンピューターを多くの人が使用することはほとんどありません。そのため、その名のとおりパソコンと呼ばれています。携帯電話やタブレットのようなものはより個人的で、めったに共有されません、私は中国でそう思います。
もちろん、グーグルはより大規模な戦略的展開を持っており、タブレットには複数の人がいる可能性があるため、完全に誘惑されているわけではありません。
そのため、Googleはマルチユーザーを作成しており、すべてのユーザーのアプリケーション、データ、およびパーソナリティの構成を分離する必要があります。アプリケーションとパーソナリティの構成を行うことができます。考えてみてください。アクセス制御を介して、各ユーザーは自分のアプリケーションのみを表示でき、デスクトップも自分のアプリケーションを使用できます。
データはどうですか? ? ? ?
OK、ユーザーデータのマウント構造を調整します。 Android 4.2は、ヒューズテクノロジーも使用します。/dev/fuseは/ storage / emulated / 0ディレクトリにマウントされます。なぜ0なのか、最初の意味である上記のsdcard0を覚えていますか。 (2番目のカードがある場合は/ storage / emulated / 1である必要があり、3人の息子は外部SDカードを持っていないため、確認する方法はありません)
以前と互換性を持たせるために、/ storage / emulated / legacy(名前が変更され、従来型)にマウントし、3つのソフト接続/ storage / sdcard0、/ sdcard、/ mnt / Sdcardを作成します。どちらも/ storage / emulated / legacyを指します。
多くの学生は上記を真剣に見ていないかもしれません、ここで私は簡単に要約します:
1、ここでsdcard /、mnt / sdcard、storage / sdcard0、storage / emulated / 0、storage / emulated / legacyはすべて同じパスの異なる「ポインター」であり、同じ1つの場所を指し、異なるAndroidバージョンは異なる方法で呼び出されます。
2.各バージョンの外部ストレージパスを知りたい場合、学生はgetExternalStorageDirectoryメソッドの印刷結果を比較できます。

5つ目は、RAM、Rom、および拡張ストレージ(TFカード)の内部ストレージの違い、外部ストレージの違いを理解するための図です。

画像
1.まず、いくつかの概念、メモリ、内部ストレージ、外部ストレージ、および本体ストレージ(組み込みストレージ)を理解しましょう。
1.1メモリ英語でメモリと呼びます。メモリはコンピュータの重要な部分の1つであり、CPUと通信するためのブリッジです。コンピュータ内のすべてのプログラムはメモリ内で実行されるため、コンピュータの実行に使用され、データの保存には使用されません。
1.2内部ストレージ、外部ストレージ内部ストレージ、外部ストレージと呼びます。これら2つの概念は、初期のAndroidスマートマシンに由来します。4.4より前の組み込みストレージは内部ストレージです。外部SDカードは外部ストレージです。 getDataDirectoryを介して内部ストレージルートパスを取得し、getExternalStorageDirectoryを介して外部SDカードルートパスを取得できます。 4.4以降、外部ストレージは2つの部分で構成され、本体ストレージの外部ストレージはgetExternalStorageDirectoryを介して取得され、外部SDカードはgetExternalDirsトラバーサルを介して取得される必要があります。
1.3ボディストレージボディストレージとは、電話自体が搭載し、工場から出荷済みのストレージスペースを指します。4.4胴体ストレージが内部ストレージになる前、4.4以降のボディストレージには、内部ストレージと外部ストレージが含まれます。
2、Ram、Rom、および拡張ストレージ(TFカード)の概念。写真からわかるように、携帯電話にはメモリ、内蔵メモリ、SDカードが搭載されています。それらはRam、Rom、およびTFカードです。これら3枚のカードの性能、素材、価格は異なります。有用。
3、内部ストレージ、外部ストレージの概念。多くの人がこれを誤解しており、ボディストレージはメモリであり、SDカードは外部ストレージと呼ばれていますが、これは実際には間違っています。Androidのバージョンが異なると、最初の記事を参照してください。
最後に、私の例を添付します。
http://download.csdn.net/download/u010937230/9930396