持久化技术--文件存储
文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何格式化的处理,所有的数据都是原封不动的存储到文件中,因而适合存储一些简单的文本数据或者二进制数据
文件存储的核心技术:使用Context
类中提供的openFileInput()
和openFileOutput()
方法
将文件存储到文件中
使用文件存储,存储的默认路径为(且不能更改):/data/data/<packageName>/files/目录下
-
Context
类中提供了一个openFileOutput(String name, Int mode)
方法,在文件存储技术中实现数据的存储<name: 文件名称 mode:文件的操作模式>
文件的操作模式,主要有两种模式可以选择:MODE_PRIVATE(默认的操作模式):表示当指定同样文件名的时候,所写的内容将会覆盖原文件中的内容;MODE_APPEND:表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件
指定的文件名不可以包含路径
代码如下:
/**当活动销毁的时候,将界面上的文本框内的内容利用文件存储技术存储到文件中*/
public class MainActivity extends Activity {
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//假设界面上有一个输入文本框
edit = (EditText) findViewById(R.id.edit);
}
@Override
protected void onDestroy() {
super.onDestroy();
String inputText = edit.getText().toString();
save(inputText);
}
public void save(String inputText) {
BufferedWriter writer = null;
try {
//通过Context类的openFileOutput方法拿到文件的输出字节流,将此字节流包装为带缓冲区的字符输出流
writer = new BufferedWriter(new OutputStreamWriter(openFileOutput("data", Context.MODE_PRIVATE)));
writer.write(inputText);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if (writer != null) {
writer.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
从文件中读取数据
使用文件存储功能取出数据,默认的路径(不可更改)是/data/data/<packageName>/files/
- Context类中提供了一个
openFileInput()
方法,得到文件字节输入流
更改以上代码:(在onCreate()
中增加代码并增加一个成员方法):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit = (EditText) findViewById(R.id.edit);
String inputText = load();
//使用TextUtils类的isEmpty方法进行双重判断,文本内容为null或者为空字符串则返回true
if (!TextUtils.isEmpty(inputText)) {
edit.setText(inputText);
//将光标移到文本最后
edit.setSelection(inputText.length());
Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_SHORT).show();
}
}
public String load() {
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
//通过Context类的openFileInput()方法获得文件输入字节流,通过包装得到带缓冲区的字符串输入流
reader = new BufferedReader(new InputStreamReader(openFileInput("data")));
String line = "";
while ((line = reader.readLine()) != null) {
content.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
使用API获取内存存储路径
- (/data/data/(packageName)/files/)获取此路径对象,使用方法
public File getFilesDir ()
- (/data/data/(packageName)/cache/)获取此路径对象,使用方法
public File getCacheDir()
当内部存储空间存储不足时,cache文件夹下的文件会被删除
使用API获取外部存储路径(sd卡真实路径)
- (storage/sdcard0/)获取此路径对象,使用方法:
File Environment.getExternalStorageDirectory()
使用API获取外部存储的状态
使用Environment.getExternalStorageState()
获取状态,常见状态:
- Environment.MEDIA_UNKNOWN:表示不能识别sd卡
- Environment.MEDIA_REMOVED:表示没有sd卡
- Environment.MEDIA_UNMOUNTED:表示sd卡存在但是没有挂载
- Environment.MEDIA_CHECKING:表示sd卡正在准备
- Environment.MEDIA_MOUNTED:表示sd卡挂载,正常使用
使用API获取外部存储设备的容量
存储设备都是分块的
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取外部存储空间路径
File path = Environment.getExternalStorageDirectory();
//创建StatFs对象,此对象可获得存储信息
StatFs stat = new StatFs(path.getPath());
long blockSize;
long availableBlocks;
//判断当期系统使用的版本号
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1) {
//这两个方法只有在 API level 18及以上才可以使用
//获得存储设备分块大小
blockSize = stat.getBlockSizeLong();
//获得存储设备可用分块数量
availableBlocks = stat.getAvailableBlocksLong();
}else {
blockSize = stat.getBlockSize();
availableBlocks = stat.getAvailableBlocks();
}
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(formatSize(availableBlocks * blockSize));
}
//将存储设备可用大小转换成合适的单位
private String formatSize(long size){
return Formatter.formatFileSize(this, size);
}
}