您的位置:首页 > 移动开发 > Android开发

【Android】数据存储之文件存储

2016-06-11 21:41 471 查看

前言

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

}

}


界面展示:

输入数据界面



点击保存数据



点击读取信息



总结

关于文件存储,内部存储和外部存储都有其特点,内部存储的安全性较高,外部存储数据访问方便。总之,就是需要根据需要选择合适的存储方式才好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: