




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十二章Android-数据存储之文件存储1本章目标掌握简单存储SharedPreferences的使用时机和实现方式掌握文件存储的实现方式2本章教学内容简单存储SharedPreferences文件存储3简单存储简介SharedPreferences是一种轻量级的数据保存方式通过SharedPreferences可以将NVP(Name/ValuePair,名称/值对)保存在Android的文件系统中,而且SharedPreferences完全屏蔽的对文件系统的操作过程开发人员仅是通过调用SharedPreferences对NVP进行保存和读取4应用程序间数据共享的三种访问模式SharedPreferences不仅能够保存数据,还能够实现不同应用程序间的数据共享SharedPreferences支持三种访问模式私有(MODE_PRIVATE):仅有创建程序有权限对其进行读取或写入全局读(MODE_WORLD_READABLE):不仅创建程序可以对其进行读取或写入,其他应用程序也读取操作的权限,但没有写入操作的权限全局写(MODE_WORLD_WRITEABLE):创建程序和其他程序都可以对其进行写入操作,但没有读取的权限5SharedPreferences创建和使用步骤1.在使用SharedPreferences前,先定义SharedPreferences的访问模式下面的代码将访问模式定义为私有模式有的时候需要将SharedPreferences的访问模式设定为即可以全局读,也可以全局写,这样就需要将两种模式写成下面的方式publicstaticintMODE=
MODE_PRIVATE;publicstaticintMODE=Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE;6SharedPreferences创建和使用步骤2.定义SharedPreferences的名称SharedPreferences的名称与在Android文件系统中保存的文件同名。因此,只要具有相同的SharedPreferences名称的NVP内容,都会保存在同一个文件中为了可以使用SharedPreferences,需要将访问模式和SharedPreferences名称作为参数,传递到getSharedPreferences()函数,并获取到SharedPreferences对象publicstaticfinalStringPREFERENCE_NAME="SaveSetting";SharedPreferencessharedPreferences=getSharedPreferences(PREFERENCE_NAME,MODE);7SharedPreferences创建和使用步骤3.修改共享的具体数据在获取到SharedPreferences对象后,则可以通过SharedPreferences.Editor类对SharedPreferences进行修改,最后调用commit()函数保存修改内容SharedPreferences广泛支持各种基本数据类型,包括整型、布尔型、浮点型和长型等等SharedPreferences.Editoreditor=sharedPreferences.edit();editor.putString("Name","Tom");editor.putInt("Age",20);editor.putFloat("Height",);mit();8SharedPreferences创建和使用步骤读取共享的数据如果需要从已经保存的SharedPreferences中读取数据,同样是调用getSharedPreferences()函数,并在函数的第1个参数中指明需要访问的SharedPreferences名称,最后通过get<Type>()函数获取保存在SharedPreferences中的NVPget<Type>()函数的第1个参数是NVP的名称第2个参数是在无法获取到数值的时候使用的缺省值SharedPreferencessharedPreferences=getSharedPreferences(PREFERENCE_NAME,MODE);Stringname=sharedPreferences.getString("Name","DefaultName");intage=sharedPreferences.getInt("Age",20);floatheight=sharedPreferences.getFloat("Height",);9简单存储-示例访问其他应用程序的SharedPreferences必须满足三个条件共享者需要将SharedPreferences的访问模式设置为全局读或全局写访问者需要知道共享者的包名称和SharedPreferences的名称,以通过Context获得SharedPreferences对象访问者需要确切知道每个数据的名称和数据类型,用以正确读取数据10本章教学内容简单存储SharedPreferences文件存储11文件存储Android使用的是基于Linux的文件系统,程序开发人员可以建立和访问程序自身的私有文件,也可以访问保存在资源目录中的原始文件和XML文件,还可以在SD卡等外部存储设备中保存文件12文件存储内部存储Android系统允许应用程序创建仅能够自身访问的私有文件,文件保存在设备的内部存储器上,在Linux系统下的/data/data/<packagename>/files目录中Android系统不仅支持标准Java的IO类和方法,还提供了能够简化读写流式文件过程的函数主要介绍的两个函数openFileOutput()openFileInput()13文件存储内部存储openFileOutput()函数openFileOutput()函数为写入数据做准备而打开的应用程序私文件,如果指定的文件不存在,则创建一个新的文件openFileOutput()函数的语法格式如下第1个参数是文件名称,这个参数不可以包含描述路径的斜杠第2个参数是操作模式函数的返回值是FileOutputStream类型publicFileOutputStreamopenFileOutput(Stringname,intmode)14文件存储内部存储openFileOutput()函数Android系统支持四种文件操作模式模式说明MODE_PRIVATE私有模式,缺陷模式,文件仅能够被文件创建程序访问,或具有相同UID的程序访问。MODE_APPEND追加模式,如果文件已经存在,则在文件的结尾处添加新数据。MODE_WORLD_READABLE全局读模式,允许任何程序读取私有文件。MODE_WORLD_WRITEABLE全局写模式,允许任何程序写入私有文件。15文件存储内部存储openFileOutput()函数使用openFileOutput()函数建立新文件的示例代码如下第1行代码定义了建立文件的名称fileDemo.txt第2行代码使用openFileOutput()函数以私有模式建立文件第4行代码调用write()函数将数据写入文件第5行代码调用flush()函数将所有剩余的数据写入文件第6行代码调用close()函数关闭FileOutputStreamStringFILE_NAME="fileDemo.txt";FileOutputStreamfos=openFileOutput(FILE_NAME,Context.MODE_PRIVATE)Stringtext=“Somedata”;fos.write(text.getBytes());fos.flush();fos.close();16文件存储内部存储openFileOutput()函数为了提高文件系统的性能,一般调用write()函数时,如果写入的数据量较小,系统会把数据保存在数据缓冲区中,等数据量累积到一定程度时再一次性的写入文件中由上可知,在调用close()函数关闭文件前,务必要调用flush()函数,将缓冲区内所有的数据写入文件17文件存储内部存储openFileInput()函数openFileInput()函数为读取数据做准备而打开应用程序私文件openFileInput()函数的语法格式如下第1个参数也是文件名称,同样不允许包含描述路径的斜杠publicFileInputStreamopenFileInput(Stringname)18文件存储内部存储openFileInput()函数使用openFileInput()函数打开已有文件的示例代码如下上面的两部分代码在实际使用过程中会遇到错误提示,因为文件操作可能会遇到各种问题而最终导致操作失败,因此代码应该使用try/catch捕获可能产生的异常StringFILE_NAME="fileDemo.txt";FileInputStreamfis=openFileInput(FILE_NAME);
byte[]readBytes=newbyte[fis.available()];while(fis.read(readBytes)!=-1){}19文件存储内部存储InternalFileDemo示例用来演示在内部存储器上进行文件写入和读取InternalFileDemo示例用户界面如图20文件存储内部存储InternalFileDemo示例的核心代码OnClickListenerwriteButtonListener=newOnClickListener(){ @Override publicvoidonClick(Viewv){ FileOutputStreamfos=null; try{
if(appendBox.isChecked()){ fos=openFileOutput(FILE_NAME,Context.MODE_APPEND);
}else{
fos=openFileOutput(FILE_NAME,Context.MODE_PRIVATE);
} Stringtext=entryText.getText().toString(); fos.write(text.getBytes()); labelView.setText("文件写入成功,写入长度:"+text.length()); entryText.setText("");
}catch(FileNotFoundExceptione){21文件存储内部存储e.printStackTrace(); } catch(IOExceptione){ e.printStackTrace(); } finally{ if(fos!=null){ try{ fos.flush(); fos.close(); }catch(IOExceptione){ e.printStackTrace(); } } } }};22文件存储内部存储33.OnClickListenerreadButtonListener=newOnClickListener(){@Override publicvoidonClick(Viewv){ displayView.setText(""); FileInputStreamfis=null; try{
fis=openFileInput(FILE_NAME);
if(fis.available()==0){ return;
}
byte[]readBytes=newbyte[fis.available()];
while(fis.read(readBytes)!=-1){
}
Stringtext=newString(readBytes);
displayView.setText(text);
labelView.setText("文件读取成功,文件长度:"+text.length());
}catch(FileNotFoundExceptione){23文件存储内部存储程序运行后,在/data/data/edu.hrbeu.InternalFileDemo/files/目录下,找到了新建立的fileDemo.txt文件e.printStackTrace(); } catch(IOExceptione){ e.printStackTrace(); } }};24文件存储内部存储fileDemo.txt文件fileDemo.txt从文件权限上进行分析,“-rw-rw---”表明文件仅允许文件创建者和同组用户读写,其他用户无权使用文件的大小为9个字节,保存的数据为“Somedata”25文件存储外部存储Android的外部存储设备指的是SD卡(SecureDigitalMemoryCard),是一种广泛使用于数码设备上的记忆卡不是所有的Android手机都有SD卡,但Android系统提供了对SD卡的便捷的访问方法26文件存储外部存储SD卡适用于保存大尺寸的文件或者是一些无需设置访问权限的文件,可以保存录制的大容量的视频文件和音频文件等SD卡使用的是FAT(FileAllocationTable)的文件系统,不支持访问模式和权限控制,但可以通过Linux文件系统的文件访问权限的控制保证文件的私密性Android模拟器支持SD卡,模拟器中有缺省的SD卡,如果想在多个模拟器中共享相同的SD卡,则开发人员须在模拟器中手工添加SD卡的映像文件27文件存储外部存储使用<AndroidSDK>/tools目录下的mksdcard工具创建SD卡映像文件,命令如下第1个参数-1表示后面的字符串是SD卡的标签,这个新建立的SD卡的标签是SDCARD第2个参数256M表示SD卡的容量是256兆最后一个参数表示SD卡映像文件的保存位置,上面的命令将映像保存在E:\android目录下sdcard_file文件中。在CMD中执行该命令后,则可在所指定的目录中找到生产的SD卡映像文件mksdcard-lSDCARDE:\android\sdcard_file28文件存储外部存储如果希望Android模拟器启动时能够自动加载指定的SD卡,还需要在模拟器的“运行设置”(RunConfigurations)中添加SD卡加载命令SD卡加载命令中只要指明映像文件位置即可SD卡加载命令29文件存储外部存储测试SD卡映像是否正确加载在模拟器启动后,使用FileExplorer向SD卡中随意上传一个文件,如果文件上传成功,则表明SD卡映像已经成功加载向SD卡中成功上传了一个测试文件test.txt,文件显示在/sdcard目录下30文件存储外部存储编程访问SD卡首先需要检测系统的/sdcard目录是否可用如果不可用,则说明设备中的SD卡已经被移除,在Android模拟器则表明SD卡映像没有被正确加载如果可用,则直接通过使用标准的Java.io.File类进行访问将数据保存在SD卡通过“生产随机数列”按钮生产10个随机小数通过“写入SD卡”按钮将生产的数据保存在SD卡的目录下SDcardFileDemo示例说明了如何将数据保存在SD卡具备相应的权限(6.0以后版本需要动态权限)<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>31文件存储外部存储下图是SDcardFileDemo示例的用户界面32文件存储外部存储SDcardFileDemo示例运行后,在每次点击“写入SD卡”按钮后,都会在SD卡中生产一个新文件,文件名各不相同SD卡中生产的文件33文件存储外部存储SDcardFileDemo示例与InternalFileDemo示例的核心代码比较相似SDcardFileDemo示例与InternalFileDemo示例的不同之处第7行代码中添加了/sdcard目录存在性检查第8行代码使用“绝对目录+文件名”的形式表示新建立的文件第12行代码写入文件前对文件存在性和可写入性进行检查第5行代码为了保证在SD卡中多次写入时文件名不会重复,在文件名中使用了唯一且不重复的标识,这个标识通过调用System.currentTimeMillis()函数获得,表示从1970年00:00:00到当前所经过的毫秒数34文件存储外部存储下面是SDcardFileDemo示例的核心代码privatestaticStringrandomNumbersString="";OnClickListenerwriteButtonListener=newOnClickListener(){ @Override publicvoidonClick(Viewv){ StringfileName="SdcardFile-"+System.currentTimeMillis()+".txt"; Filedir=newFile("/sdcard/"); if(dir.exists()&&dir.canWrite()){
FilenewFile=newFile(dir.getAbsolutePath()+"/"+fileName);
FileOutputStreamfos=null;
try{
newFile.createNewFile();
if(newFile.exists()&&newFile.canWrite()){
fos=newFileOutputStream(newFile);
fos.write(randomNumbersString.getBytes());35文件存储外部存储
TextViewlabelView=(TextView)findViewById(R.id.label); labelView.setText(fileName+"文件写入SD卡");
} }catch(IOExceptione){
e.printStackTrace(); }finally{
if(fos!=null){ try{
fos.flush();
fos.close(); } catch(IOExceptione){}
}
}
} }};36文件存储资源文件程序开发人员可以将程序开发阶段已经准备好的原始格式文件和XML文件分别存放在/res/raw和/res/xml目录下,供应用程序在运行时进行访问原始格式文件可以是任何格式的文件,例如视频格式文件、音频格式文件、图像文件和数据文件等等,在应用程序编译和打包时,/res/raw目录下的所有文件都会保留原有格式不变/res/xml目录下的XML文件,一般用来保存格式化的数据,在应用程序编译和打包时会将XML文件转换为高效的二进制格式,应用程序运行时会以特殊的方式进行访问37文件存储资源文件ResourceFileDemo示例演示了如何在程序运行时访问资源文件当用户点击“读取原始文件”按钮时,程序将读取/res/raw/raw_file.txt文件,并将内容显示在界面上38文件存储资源文件当用户点击“读取XML文件”按钮时,程序将读取/res/xml/people.xml文件,并将内容显示在界面上39文件存储资源文件读取原始格式文件,首先需要调用getResource()函数获得资源对象,然后通过调用资源对象的openRawResource()函数,以二进制流的形式打开指定的原始格式文件。在读取文件结束后,调用close()函数关闭文件流ResourceFileDemo示例中关于读取原始格式文件的核心代码如下Resourcesresources=this.getResources();InputStreaminputStream=null;try{ inputStream=resources.openRawResource(R.raw.raw_file); byte[]reader=newbyte[inputStream.available()]; while(inputStream.read(reader)!=-1){}40文件存储资源文件代码第8行的newString(reader,"utf-8"),表示以UTF-8的编码方式,从字节数组中实例化一个字符串程序开发人员需要确定/res/raw/raw_file.txt文件使用的是UTF-8编码方式,否则程序运行时会产生乱码displayView.setText(newString(reader,"utf-8"));}catch(IOExceptione){ Log.e("ResourceFileDemo",e.getMessage(),e);}finally{ if(inputStream!=null){ try{ inputStream.close(); } catch(IOExceptione){} }}41文件存储资源文件确认的方法右击raw_file.txt文件选择“Properties”打开raw_file.txt文件的属性设置框在Resource栏下的Textfileencoding中,选择“Other:UTF-8”42文件存储资源文件/res/xml目录下的XML文件会转换为一种高效的二进制格式说明如何在程序运行时读取/res/xml目录下的XML文件首先在/res/xml目录下创建一个名为people.xml的文件XML文件定义了多个<person>元素,每个<person>元素都包含三个属性name、age和height,分别表示姓名、年龄和身高/res/xml/people.xml文件代码如下<people> <personname="李某某"age="21"height="1.81"/> <personname="王某某"age="25"height="1.76"/> <personname="张某某"age="20"height="1.69"/></people>43文件存储资源文件读取XML格式文件首先通过调用资源对象的getXml()函数,获取到XML解析器XmlPullParserXmlPullParser是Android平台标准的XML解析器,这项技术来自一个开源的XML解析API项目XMLPULLResourceFileDemo示例中关于读取XML文件的核心代码如下XmlPullParserparser=resources.getXml(R.xml.people);Stringmsg="";try{ while(parser.next()!=XmlPullParser.END_DOCUMENT){ Stringpeople=parser.getName(); Stringname=null;44文件存储资源文件Stringage=null; Stringheight=null; if((people!=null)&&people.equals("person")){
intcount=parser.getAttributeCount();
for(inti=0;i<count;i++){
StringattrName=parser.getAttributeName(i);
StringattrValue=pa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 从医之路活动方案
- 仙人酒吧开业活动方案
- 代理加盟活动方案
- 代驾公司三周年活动方案
- 仪式之礼活动方案
- 价格服务活动方案
- 企业参访推广活动方案
- 仿写作文竞赛活动方案
- 企业乔迁活动方案
- 企业元宵佳节活动方案
- 化妆品代加工保密协议
- 2024年高等教育法学类自考-00229证据法学考试近5年真题附答案
- 新媒体环境下的品牌策划学习通超星期末考试答案章节答案2024年
- 2024年重庆高考化学试题卷(含答案解析)
- 股东之间股权转让合同协议书(2篇)
- 人体器官讲解课件
- 惠州市惠城区2024-2025学年数学四年级第一学期期末调研模拟试题含解析
- 2024中考满分作文9篇
- 04S519小型排水构筑物(含隔油池)图集
- 2024至2030年中国无机陶瓷膜行业市场运营格局及投资前景预测报告
- 运用PDCA循环提高全麻患者体温检测率
评论
0/150
提交评论