Android数据存储之文件操作

/ 0评 / 9

内部存储和外部存储

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);

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注