内部存储和外部存储
android的存储方式分为内部存储和外部存储,注意,内部存储不是内存,内部存储位于系统中很特殊的一个位置,默认是你应用程序的包名,(/data/data/包名 下),这个文件夹里面的数据默认只有你的应用可以访问到,当你的应用被卸载时,这和文件夹以及里面的所有文件也会被一起删除,最容易混淆的是外部存储,如果说pc上也要区分出外部存储和内部存储的话,那么自带的硬盘算是内部存储,U盘或者移动硬盘算是外部存储,因此我们很容易带着这样的理解去看待安卓手机,认为机身固有存储是内部存储,而扩展的T卡是外部存储。所有的安卓设备都有外部存储和内部存储,这两个名称来源于安卓的早期设备,那个时候的设备内部存储确实是固定的,而外部存储确实是可以像U盘一样移动的。但是在后来的设备中,很多中高端机器都将自己的机身存储扩展到了8G以上,他们将存储在概念上分成了"内部internal" 和"外部external" 两部分,但其实都在手机内部。所以不管安卓手机是否有可移动的sdcard,他们总是有外部存储和内部存储。最关键的是,我们都是通过相同的api来访问可移动的sdcard或者手机自带的存储(外部存储)。
由于内部存储空间是有限的,所以这个地方放置的都是一些经常被访问到的文件,Sqlite以及SharedPreferences的数据就存储在这里,这里也可以存储文件以及缓存文件,但是文件大小不能太大,不然占用系统空间,所以android系统一般在外部存储上也可以存储文件以及缓存文件,并且和内部存储一样,默认为应用程序的包名(Android/data/包名),这个文件夹存在于外部存储上,但是可以缓存大文件,同样,在应用程序卸载时,这里面的所有文件也是一同被删除
如果想让应用卸载以后,但是应该产生的数据不被删除,比如下载的视频,音乐等,那就在外部存储的根目录下创建一个文件夹,用于存储数据(应用卸载后依旧保留)
内部存储和外部存储的使用
- 获取存储空间的文件存放目录与缓存存放目录
内部存储
///data/data/com.jay.textproject/files
File filesDir = getFilesDir();
// /data/data/com.jay.textproject/cache
File cacheDir = getCacheDir();
外部存储
// /storage/emulated/0/Android/data/com.jay.textproject/files
File externalFilesDir = getExternalFilesDir(null);
// /storage/emulated/0/Android/data/com.jay.textproject/cache
File externalCacheDir = getExternalCacheDir();
上面四个函数获取的目录,在里面创建的文件,当应用卸载以后,里面的文件会被一同删除
例子:
File file = getFilesDir(); File out = new File(file.getPath(),"out.txt"); try { FileWriter fileWriter = new FileWriter(out); fileWriter.write("这是写在内部存储里面的数据,应用卸载后一同被删除"); fileWriter.close(); } catch (IOException e) { e.printStackTrace(); }
与获取SharedPreferences类似,Context类提供了两个方法,可以直接读写内部存储中的文件(和上面的例子一样)
//打开文件获取数据流
abstract FileInputStream openFileInput(String name);
//往文件中写入数据
abstract FileOutputStream openFileOutput(String name,int mode);
外部存储上的文件操作
在使用外部存储的时候,需要判断外部存储的状态,因为可能由于某些原因,外部存储没有加载,或者外部存储不支持等,获取外部存储状态可以使用Environment的静态方法getExternalStorageState(),返回值为外部存储的状态
String state = Environment.getExternalStorageState();
例子
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { Log.v("state", "可以读写"); } else if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)) { Log.v("state", "只读"); } else { Log.v("state", "外部存储不可使用"); }
获取外部存储根目录
File file = Environment.getExternalStorageDirectory();
例子:在外部存储上面创建一个文件夹(此文件夹不会随着应用的卸载而删除)
//判断外部存储可用代码略 File externalStorageDirectory = Environment.getExternalStorageDirectory(); File other = new File(externalStorageDirectory, "这是自定义文件夹"); if (!other.exists()) { other.mkdirs(); }
获取外部存储上的特定文件夹
public static File getExternalStoragePublicDirectory (String type)
File picFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);