博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android下的数据储存方式( 二)
阅读量:5309 次
发布时间:2019-06-14

本文共 3835 字,大约阅读时间需要 12 分钟。

 

在上一篇文章中我们介绍了SharedPreferences的使用方法。

今天我们继续介绍另一种储存数据的方式:使用内部储存和外部储存

 

每一个Android设备都拥有两个数据储存区域:外部储存和外部储存

那么我们应该采用哪种储存方式呢?

我们先对比一下这两种储存方式的不同:

内部储存:

  • 总是可用的
  • 保存在这里的文件只能被你的app访问
  • 当程序被卸载的时候,系统会删除所有属于该应用的文件

    当你不希望你的文件被其他人或应用访问到的时候,内部储存是最好的选择

外部储存:

  • 当sd卡被用户卸载的时候不可用,因此可能需要做额外的检测动作
  • 外部储存可被所有人或应用读取,安全性差
  • 当应用被卸载的时候,只有保存在通过getExternalFilesDir()获取的路径上的文件被删除

    当储存空间紧缺和文件的访问不需要被限制的时候,外部储存是最好的选择

保存文件到内部储存

文件的操作主要用到java的io包里面的类。

要获取属于你的程序的储存空间,可以使用下面的两个方法:

getFilesDir()

          返回一个File类型的内部储存路径

getCacheDir()

          返回一个File类型的内部临时储存路径

 

先看一下运行效果:

 

运行完毕到Eclipse的ddms视图就可以看到文件已经被写入:

 

 

详细代码:

package com.whathecode.storageoptinos;import java.io.FileOutputStream;import android.app.Activity;import android.content.Context;import android.content.SharedPreferences;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity{	@Override	protected void onCreate(Bundle savedInstanceState)	{		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);		final EditText namefield = (EditText) findViewById(R.id.username);		final EditText agefield = (EditText) findViewById(R.id.age);		Button btnWrite = (Button) findViewById(R.id.write);		SharedPreferences spf = getSharedPreferences("record", MODE_PRIVATE);		// 获取编辑器		final SharedPreferences.Editor editor = spf.edit();		btnWrite.setOnClickListener(new View.OnClickListener()		{			@Override			public void onClick(View v)			{				String filename = "person.txt";				// File file = new File(getBaseContext().getFilesDir(),				// filename);				String username = namefield.getText().toString();				String age = agefield.getText().toString();				try				{					FileOutputStream openFileOutput = openFileOutput(filename,							Context.MODE_PRIVATE);					openFileOutput.write(username.getBytes());					openFileOutput.write(age.getBytes());					openFileOutput.close();					Toast.makeText(getBaseContext(),							"file saved at " + getFilesDir().toString(),							Toast.LENGTH_LONG).show();				} catch (Exception e)				{					e.printStackTrace();				}			}		});	}}

 

保存文件到外部储存

和内部储存不同,写文件到外部储存需要在AndroidManifest文件中获取相应的权限。

 

 

当你的程序获得了写外部储存的权限的时候,同时隐式地获得读的权限,因此不需要另外添加读的权限。

 

运行结果:

 

程序代码:

package com.whathecode.storageoptinos;import java.io.File;import java.io.FileOutputStream;import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity{	@Override	protected void onCreate(Bundle savedInstanceState)	{		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);		final EditText namefield = (EditText) findViewById(R.id.username);		final EditText agefield = (EditText) findViewById(R.id.age);		Button btnWrite = (Button) findViewById(R.id.write);		btnWrite.setOnClickListener(new View.OnClickListener()		{			@Override			public void onClick(View v)			{				String filename = "person.txt";				String externDir = getExternalFilesDir(null).toString();				// 准备数据写入				String username = namefield.getText().toString();				String age = agefield.getText().toString();				// 判断sd卡是否挂载,sd卡存在则开始写入文件				if (Environment.getExternalStorageState().equals(						Environment.MEDIA_MOUNTED))				{					try					{						FileOutputStream fos = new FileOutputStream(new File(								externDir, filename));						fos.write(username.getBytes());						fos.write(age.getBytes());						fos.close();						Toast.makeText(getBaseContext(),								"file saved at " + externDir, Toast.LENGTH_LONG)								.show();					} catch (Exception e)					{						e.printStackTrace();					}				} else				{					Toast.makeText(getBaseContext(), "SD卡不存在",							Toast.LENGTH_SHORT).show();				}			}		});	}}

文件保存路径:

转载于:https://www.cnblogs.com/ai-developers/p/4246204.html

你可能感兴趣的文章
关于View控件中的Context选择
查看>>
2018icpc徐州OnlineA Hard to prepare
查看>>
Spark的启动进程详解
查看>>
使用命令创建数据库和表
查看>>
机器视觉:SSD Single Shot MultiBox Detector
查看>>
201521123044 《Java程序设计》第1周学习总结
查看>>
MIT Scheme 的基本使用
查看>>
程序员的“机械同感”
查看>>
在16aspx.com上下了一个简单商品房销售系统源码,怎么修改它的默认登录名和密码...
查看>>
c++回调函数
查看>>
linux下Rtree的安装
查看>>
【Java】 剑指offer(53-2) 0到n-1中缺失的数字
查看>>
Delphi中ListView类的用法
查看>>
多米诺骨牌
查看>>
Linq 学习(1) Group & Join--网摘
查看>>
asp.net 调用前台JS调用后台,后台掉前台JS
查看>>
Attribute(特性)与AOP
查看>>
苹果手表:大方向和谷歌一样,硬件分道扬镳
查看>>
Competing Consumers Pattern (竞争消费者模式)
查看>>
Android面试收集录15 Android Bitmap压缩策略
查看>>