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

前言


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

界面展示:

输入数据界面




点击保存数据



点击读取信息


总结


   关于文件存储,内部存储和外部存储都有其特点,内部存储的安全性较高,外部存储数据访问方便。总之,就是需要根据需要选择合适的存储方式才好。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 32
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值