【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; } } }
界面展示:
输入数据界面
点击保存数据
点击读取信息
总结
关于文件存储,内部存储和外部存储都有其特点,内部存储的安全性较高,外部存储数据访问方便。总之,就是需要根据需要选择合适的存储方式才好。相关文章推荐
- Android 读取后台数据并显示。模拟小区车辆管理系统
- Android单元测试
- Android中获取手机中的联系人信息
- java/android 设计模式学习笔记(9)---代理模式
- Android 动画总结
- Android之GLES2.0显示立方体各面不同图片测试代码3
- Android使用Rxjava异步递归读取内存卡中所有的视频文件
- Android基础学习之ArrayAdaptery以及SimpleAdapter的使用
- Android—应用程序开机自启
- 首次使用Android Studio应该做的事
- 【android studio】android studio使用过程中,搜集的一些问题
- Android configChanges
- Android Studio导入项目的几种方法
- Android5.0控件-RecyclerView
- Android中ViewPager和Fragment的使用
- 【自定义View】02--measure源码详尽分析
- android控件的深入使用
- Androidstudio真机调试出现的问题
- JetBrains公司系列IDE开发工具通用初始配置推荐(Android Studio、InterlliJ、PHPStorm、CLion、Webstorm等)
- Android入门--弹出三个按钮的对话框