Android文件存储 http://ipjmc.iteye.com/blog/1447097
Internal Storage内部存储空间
所谓的内部存储与外部存储,是指是否是手机内置。手机内置的存储空间,称为内部存储,它是手机一旦出厂就无法改变,它也是手机的硬件指标之一,通常来讲手机内置存储空间越大意味着手机价格会越贵(很多地方把它称为手机内存,但我们做软件的知道,这并不准确,内存是指手机运行时存储程序,数据和指令的地方;这里应该是手机内部存储的简称为内存,而并非严格意义上的内存)。
内部存储空间十分有限,因而显得可贵,所以我们要尽可能避免使用;另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。上面所谈到的Shared Preferences和下面要谈到的SQLite数据库也都是存储在内部存储空间上的。
Android本身来讲是一个Linux操作系统,所以它的内部存储空间,对于应用程序和用户来讲就是“/data/data"目录。它与其他的(外部的存储)相比有着比较稳定,存储方便,操作简单,更加安全(因为可以控制访问权限)等优点。而它唯一的缺点就是它比较有限,比较可贵。
虽然,可以非常容易的知道程序本身的数据所在路径,所有的应用程序的数据路径都是“/data/data/app-package-name/”,所有的程序用到的数据,比如libs库,SharedPreferences都是存放在这个路径下面。但我们在使用的时候最好不要,或是千万不要直接引用这个路径。
使用内部存储主要有二个方式,一个是文件操作,一个是文件夹操作。无论哪种方式,Context中都提供了相应的函数来支持,使用Context不但操作简单方便,最重要的是Context会帮助我们管理这些文件,也可以方便帮助我们控制文件的访问权限。先来系统的说下Context中关于文件和文件夹操作的函数有哪些。
a. 创建一个文件,并打开成一个文件输出流,需要提供一个String,作为文件名
- FileOutputStream
output = Context.openOutputFile(filename, Context.MODE_PRIVATE); - output.write(data);//
use output to write whatever you like - output.close();
FileOutputStream output = Context.openOutputFile(filename, Context.MODE_PRIVATE); output.write(data);// use output to write whatever you like output.close();
FileInputStream input = Context.openInputFile(filename); input.read(); input.close();
- String[]
files = Context.fileList(); - for
(String file : files) { -
Log.e(TAG, "file is " + file); - }
String[] files = Context.fileList(); for (String file : files) { Log.e(TAG, "file is " + file); }
- if
(Context.deleteFile(filename)) { -
Log.e(TAG, "delete file " + filename + " sucessfully“); - }
else { -
Log.e(TAG, "failed to delete file " + filename); - }
if (Context.deleteFile(filename)) { Log.e(TAG, "delete file " + filename + " sucessfully“); } else { Log.e(TAG, "failed to delete file " + filename); }
File fileDir = Context.getFileDir(); Log.e(TAG, "fileDir " + fileDir.getAbsolutePath();
- File
workDir = Context.getDir(dirName, Context.MODE_PRIVATE); - Log.e(TAG,
"workdir " + workDir.getAbsolutePath();
File workDir = Context.getDir(dirName, Context.MODE_PRIVATE); Log.e(TAG, "workdir " + workDir.getAbsolutePath();
File store = Context.getFileStreamPath(filename); Log.e(TAG, "store " + store.length());
File cachedir = Context.getCacheDir(); Log.e(TAG, "cachedir " + cacheDir.getAbsolutePath());
- final
String state = Environment.getExternalStorageState(); - if
(state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us
final String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us
File sdcardDir = Environment.getExternalStorageDirectory();
我们还可以看一下常见的文件目录:
别忘了权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- Log.i(TAG,
"getFilesDir = " + getFilesDir()); - Log.i(TAG,
"getExternalFilesDir = " + getExternalFilesDir("exter_test").getAbsolutePath()); - Log.i(TAG,
"getDownloadCacheDirector y = " + Environment.getDownloadCacheDirector y().getAbsolutePath()); - Log.i(TAG,
"getDataDirectory = " + Environment.getDataDirectory().getAbsolutePath()); - Log.i(TAG,
"getExternalStorageDirect ory = " + Environment.getExternalStorageDirect ory().getAbsolutePath()); - Log.i(TAG,
"getExternalStoragePublic Directory = " + Environment.getExternalStoragePublic Directory("pub_test"));
Log.i(TAG, "getFilesDir = " + getFilesDir()); Log.i(TAG, "getExternalFilesDir = " + getExternalFilesDir("exter_test").getAbsolutePath()); Log.i(TAG, "getDownloadCacheDirectory = " + Environment.getDownloadCacheDirector y().getAbsolutePath()); Log.i(TAG, "getDataDirectory = " + Environment.getDataDirectory().getAbsolutePath()); Log.i(TAG, "getExternalStorageDirect ory = " + Environment.getExternalStorageDirect ory().getAbsolutePath()); Log.i(TAG, "getExternalStoragePublic Directory = " + Environment.getExternalStoragePublic Directory("pub_test"));
执行结果如下: