1 Shared Preferences : 通过key-value方式存放私有数据
2 Internal Storage : 存放数据在设备的存储器中
默认情况,放在Internal Storage中的文件是app私有的,其它app无法访问它。当用户卸载app时,对应的文件也会移除。
Demo:存放一个文件到Internal Storage,然后再读取此文件中的内容。
- 写入文件代码
String str = "hello world!";
String CurrentStr =str + " \n" + DateFormat.getDateTimeInstance().format(new Date());
FileOutputStream fos = openFileOutput(FILENAME,MODE_PRIVATE);
fos.write(CurrentStr.getBytes());
fos.close();
- 读取文件代码
FileInputStream fis = openFileInput(FILENAME);
byte[] buffer = new byte[1024];
ByteArrayOutputStream out = new ByteArrayOutputStream();
int bytesRead = 0;
bytesRead = fis.read(buffer);
fis.close();
- 其它函数代码(getCacheDir() , getFilesDir(), fileList())
output = "getCacheDir() : "+ getCacheDir().toString() + "\n";
output = output + "getFilesDir() : " + getFilesDir().toString() + "\n";
String[] list = fileList();
int n = 0;
while(n < list.length){
output = output + "fileList() "+ n + " : " + list[n] + "\n";
n++;
}
Toast.makeText(StorageActivity.this, output, Toast.LENGTH_LONG).show();
分析:
通过openFileOutput(String, int)存放的文件防止在/data/data/com.lewi.androidtestapp/files中,此目录也是getFilesDir()访问的路径。
如果要存放cache数据,应该通过getCacheDir()打开文件。当系统的internal storage空间低时,Android系统可能会删除cache中的文件来回复空间。
3 External Storage : 存放共有数据在共享的外部存储
每个兼容android的设备都支持共享的“External Storage”去存储文件。可能是可以插拔的SD卡,或者不可移除的internal storage。
权限
当需要读或写External Storage时,app需要再Manifest里面增加READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE。如下:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Demo:
- 增加一个相册目录
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),albumName);
if(file.exists()){
Toast.makeText(StorageActivity.this, "Folder exists, please remove it first ", Toast.LENGTH_SHORT).show();
}else{
if(file.mkdirs()){
Log.e(mTag, "Directory not created");
}
Toast.makeText(StorageActivity.this, "Create new folder : " + albumName , Toast.LENGTH_SHORT).show();
}
- 删除一个相册目录
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),albumName);
if(file.exists()){
file.delete();
Toast.makeText(StorageActivity.this, "folder " + albumName + " is deleted", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(StorageActivity.this, "Please create folder first", Toast.LENGTH_SHORT).show();
}
- 其它函数(getExternalStorageState(), getExternalStoragePublicDirectory(),getExternalCacheDir())
output = "Environment.getExternalStorageState() : " + Environment.getExternalStorageState() + "\n\n";
output = output + " getExternalStoragePublicDirectory() : " + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) + "\n\n";
output = output + " getDownloadCacheDirectory() :" + Environment.getDownloadCacheDirectory() + "\n\n";
output = output + " getExternalCacheDir() :" + getApplicationContext().getExternalCacheDir() + "\n";
Toast.makeText(StorageActivity.this, output, Toast.LENGTH_LONG).show();
截图:
4 SQLite Databases : 存放结构化数据在私有的数据库中
5 Network Connection:存放在网络服务器中
使用java.net.* 和android.net.* package来实现。
Reference:
http://developer.android.com/intl/zh-cn/guide/topics/data/data-storage.html