前言
Android系统中有5种存储方式,分别是文件存储、SharedPreferences、SQLite数据库、ContentProvider、网络存储。这五种存储方式各有其特点。下面我来简单说一下文件存储。
文件存储
文件存储是Android的一种最基本的数据存储方式,它和Java中的文件存储类似,都是通过I/O流的形式把数据原封不动地存储到文档中。不同的是,Android中的文件存储分为内部存储和外部存储。
内部存储
内部存储,将应用程序的数据以文件的方式存储到设备内存中,被其所创建的应用程序私有,应用程序卸载后也随之被删除。其他程序访问时需要权限。内部存储使用的是Context提供的openFileOutput()方法和openFileInput()方法,通过这两个方法可以分别获取FileOutputStream对象和FileInputStream对象,具体如下:
<span style="font-size:18px;">FileOutputStream openFileOutput(String name,int mode);
FileInputStream openFileInput(String name);</span>
上述两个方法中,openFileOutput()用于打开应用程序中对应的输入流,将数据存储到指定的文件中;openFileInput()用于打开应用程序对应的输入流,用于从文件中读取数据。其中,参数name表示文件名,mode表示文件的操作模式,也就是读写文件的方式,例如:MODE_PRIVATE,当前程序私有;MODE_APPEND,该文件内容可追加。存储数据时,使用FileOutputStream对象将数据存储到文件中的示例代码如下:
String fileName="data.txt"; //文件名称
String content="helloworld"; //保存数据
FileOutputStream fos;
try {
fos=openFileOutput(fileName,MODE_PRIVATE);
fos.write(content.getBytes());
fos.close();
}catch(Exception e){
e.printStackTrace();
}
取出数据时,使用FileInputStream对象读取数据的示例代码如下:
String content="";
FileInputStream fis;
try{
fis=openFileInput("data.txt"); //获取到文件的输入流对象
byte[] buffer=new byte[fis.available()];
fis.read(buffer);
content=new String(buffer);
} catch(Exception e ) {
e.printStackTrace();
}
外部存储
外部存储,是指将文件存储到一些外围设备上,例如SD卡或者内嵌的存储卡,属于永久性的存储方式。外部存储的文件可以被其他应用程序所共享,当将外围设备连接到计算机时,这些文件可以被浏览、修改和删除,因此这种方式存在安全隐患。
因为外围设备可能被移除,丢失或者处于其他状态,因此在使用外围设备之前必须使用Environment.getExternalStorageState()方法来确认外围设备是否可用,当外围设备可用且有读写权限时,就可以通过FileInputStream、FileOutputStream或者FileReader、FileWriter对象来读写外围设备中的文件。向外围设备中存储数据的示例代码如下所示:
String state=Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)){
File SDPath=Environment.getExternalStorageDirectory();
File file=new File(SDPath,"data.txt");
String data="HelloWorld";
FileOutputStream fos;
try {
fos=new FileOutputStream(file);
fos.write(data.getBytes());
fos.close();
} catch(Exception e){
e.printStackTrace();
}
}
上述代码中,使用到了Environmen.getExternalStorageDirectory();方法,该方法用于获取SD卡的根路径。手机厂商不同SD卡根目录可能不一致,用这种方法可以避免把路径写死而找不到SD卡。从外围设备中读取数据的示例代码如下所示:
String state=Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)){
File SDPath=Environment.getExternalStorageDirectory();
File file=new File(SDPath,"data.txt");
FileInputStream fis;
try {
fis=new FileInputStream(file);
BufferedReader br=new BufferedReader(new InputStreamReader(fis));
String data=br.readLine();
fis.close();
} catch(Exception e){
e.printStackTrace();
}
}
读取外围设备中的数据时,同样需要判断外围设备是否可以及是否具有读写权限,然后通过FileInputStream对象读取指定目录下的文件。
需要注意的是,Android系统为了保证应用程序的安全性做了相关的规定,如果程序需要访问系统的一些关键信息,必须要在清单文件中声明权限才可以,否则程序运行时会直接崩溃。这里操作SD卡中的数据就是系统中比较关键的信息,因此需要在清单文件的<manifest>节点下配置权限信息,具体代码如下所示:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
上述代码制定了SD卡具有可读和可写的权限,因此应用程序可以操作SD卡中的数据。
简单内部存储案例展示
代码展示:
public class MainActivity extends Activity {
private EditText et_info;
private Button btn_save;
private Button btn_read;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取布局文件中的控件
et_info = (EditText) findViewById(R.id.et_info);
btn_save = (Button ) findViewById(R.id.btn_save);
btn_read = (Button) findViewById(R.id.btn_read);
//传入实现了OnClickListener接口的类的对象
btn_save.setOnClickListener(new ButtonListener());
btn_read.setOnClickListener(new ButtonListener());
}
//定义Button按钮的点击事件
private class ButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btn_save:
String saveinfo = et_info.getText().toString().trim();
FileOutputStream fos;
try{
//保存数据,内部存储形式
fos = openFileOutput("data.txt",Context.MODE_APPEND);
fos.write(saveinfo.getBytes());
fos.close();
}
catch(Exception e){
e.printStackTrace();
}
Toast.makeText(MainActivity.this, "数据保存成功", 0).show();
break;
case R.id.btn_read:
String content = "";
try{
//获取保存的数据
FileInputStream fis = openFileInput("data.txt");
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
content = new String(buffer);
fis.close();
}
catch(Exception e){
e.printStackTrace();
}
Toast.makeText(MainActivity.this, "保存的数据是:"+content, 0).show();
break;
default:
break;
}
}
}
界面展示:
输入数据界面
点击保存数据
点击读取信息
总结
关于文件存储,内部存储和外部存储都有其特点,内部存储的安全性较高,外部存储数据访问方便。总之,就是需要根据需要选择合适的存储方式才好。