版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Android开发实战经典第8章:数据存储 文件存储北京魔乐科技软件学院李兴华研发部本章目标掌握Activity对文件存储的若干操作;可以实现文件的保存和读取操作。E-MAIL:文件存储使用SharedPreferences可以方便的完成数据的存储功能,但是其只能保存一些很简单的数据,如果想存储更多类型的数据,则可以使用文件的存储操作,如果要想操作文件,则需要Activity类的支持。E-MAIL:Activity类对文件操作的支持E-MAIL:No.方法类型描述1public FileInputStream ope
2、nFileInput(String name)普通设置要打开的文件输入流2public FileOutputStream openFileOutput(Stringname, int mode)普通设置要打开文件的输出流,指定操作的模式,可以是0、 MODE_APPEND、MODE_PRIVATE、MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE3public Resources getResources()普通返回Resources对象保存文件E-MAIL:package org.lxh.demo;import java.io.Fil
3、eNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream;import android.app.Activity;import android.os.Bundle;public class FileOperate extends Activity private static final String FILENAME = mldn.txt ;/ 设置文件名称Overridepublic void onCreate(Bundle savedInstanceState) super.onCrea
4、te(savedInstanceState); super.setContentView(R.layout.main);/ 调用布局文件FileOutputStream output = null ;/ 文件输出流try / 设置输出的文件名称,及文件创建模式output = super.openFileOutput(FILENAME, Activity.MODE_PRIVATE); catch (FileNotFoundException e) e.printStackTrace();PrintStream out = new PrintStream(output) ;/ 打印流包装out.
5、println(姓名:李兴华;);/ 输出数据out.println(年龄:30;) ;/ 输出数据out.println(地址:北京魔乐科技软件学院。) ;/ 输出数据out.close() ;/ 关闭输出流文件位置直接打开DDMS视图,可以发现输出的文件保存在“/data/data/files/”文件夹之中E-MAIL:读取文件 定义布局文件以显示文本内容E-MAIL:此布局管理器高度为屏幕高度组件高度为文字高度读取mldn.txt文件E-MAIL:package org.lxh.demo;import java
6、.io.FileInputStream; import java.io.FileNotFoundException; import java.util.Scanner;import android.app.Activity; import android.os.Bundle; import android.widget.TextView;public class FileOperate extends Activity private static final String FILENAME = mldn.txt ;/ 设置文件名称private TextView msg = null ;/
7、文本组件Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);super.setContentView(R.layout.main);/ 调用布局文件this.msg = (TextView) super.findViewById(R.id.msg) ;FileInputStream input = null;/ 文件输入流try / 找到指定文件的输入流对象input = super.openFileInput(FILENAME); catch (FileNotFo
8、undException e) e.printStackTrace();Scanner scan = new Scanner(input) ;/ 定义Scannerwhile(scan.hasNext()/ 循环读取this.msg.append(scan.next() + n) ;/ 设置文本scan.close() ;/ 关闭输入流读取文件信息E-MAIL:利用IO流操作文件 考虑到用户要自定义保存目录,以及在“sdcard”上操作,所以本程序不太适合直接使用Activity类提供的文件操作方法,用户可以直接使用最传统的IO流完成E-MAIL:mldnqa163.
9、com范例:向SDCard上保存文件E-MAIL:public class FileOperate extends Activity private static final String FILENAME = /mnt/sdcard/mldndata/mymldn.txt ;/文件名称Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); super.setContentView(R.layout.main);/ 调用布局文件File fi
10、le = new File(FILENAME) ;/ 定义File类对象if (! file.getParentFile().exists() / 父文件夹不存在file.getParentFile().mkdirs() ;/ 创建文件夹PrintStream out = null ;/ 打印流对象用于输出try out = new PrintStream(new FileOutputStream(file) ;out.println(北京魔乐科技软件学院(MLDN,www.MLDNJAVA.cn),讲师:李兴华); catch (Exception e) e.printStackTrace(
11、); finally if (out != null) out.close() ;/ 关闭打印流范例:编写AndroidManifest.xml文件配置权限E-MAIL:Environment本程序现在虽然使用IO流完成了文件的保存,但是却存在一个最大的问题,因为现在文件的路径采用的是硬编码的方式设置,那么就有可能因为sdcard不存在而出现错误,即:最好的做法就是判断sdcard是否存在,如果存在则保存,如果不存在则提示用户“sdcard”不存在,无法保存,而要想完成这个判断的功能就必须通过android.os.Environment类取得目录的信息E-MAIL:m
12、Environment定义的常量及方法E-MAIL:No.常量及方法类型描述1public static final String MEDIA_MOUNTED常量扩展存储设允许进行读/写访问2public static final String MEDIA_CHECKING常量扩展存储设处于检查状态3public static final String MEDIA_MOUNTED_READ_ONLY常量扩展存储设处于只读状态4public static final String MEDIA_REMOVED常量扩展存储设不存在5public st
13、atic final String MEDIA_UNMOUNTED常量没有找到扩展存储设6public static File getDataDirectory()普通取得Data目录7public static File getDownloadCacheDirectory()普通取得下载的缓存目录8public static File getExternalStorageDirectory()普通取得扩展的存储目录9public static String getExternalStorageState()普通取得扩展存储设备的状态10public static File getRootDi
14、rectory()普通取得Root目录11public static boolean isExternalStorageRemovable()普通判断扩展的存储目录是否被删除范例:完善文件输出的操作E-MAIL:public class FileOperate extends Activity private static final String FILENAME = mymldn.txt ;/ 设置文件名称private static final String DIR = mldndata ;/ 设置保存文件夹Overridepublic void onCreat
15、e(Bundle savedInstanceState) super.onCreate(savedInstanceState);super.setContentView(R.layout.main);/ 调用布局文件if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)/ 如果sdcard存在File file = new File(Environment.getExternalStorageDirectory().toString()+ File.separator+ DIR + File.sepa
16、rator + FILENAME) ;/ 定义File类对象if (! file.getParentFile().exists() / 父文件夹不存在file.getParentFile().mkdirs() ;/ 创建文件夹PrintStream out = null ;/ 打印流对象用于输出try out = new PrintStream(new FileOutputStream(file, true);/ 追加文件out.println(北京魔乐科技软件学院(MLDN,www.MLDNJAVA.cn),讲师:李兴华); catch (Exception e) e.printStackT
17、race(); finally if (out != null) out.close() ;/ 关闭打印流 else / SDCard不存在,使用Toast提示用户Toast.makeText(this, 保存失败,SD卡不存在!,Toast.LENGTH_LONG).show();范例:配置main.xml文件,定义组件,显示mymldn.txt文件内容E-MAIL:此布局管理器高度为屏幕高度组件高度为文字高度范例:定义Activity程序,读取文件内容:public class FileOperate extends Activity p
18、rivate static final String FILENAME = mymldn.txt ;/ 设置文件名称private static final String DIR = mldndata ;/ 设置保存文件夹private TextView msg = null ;/ 文本显示Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); super.setContentView(R.layout.main);/ 调用布局文件this.msg = (TextVi
19、ew) super.findViewById(R.id.msg) ; if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)/ 如果sdcard存在File file = new File(Environment.getExternalStorageDirectory().toString()+ File.separator+ DIR + File.separator + FILENAME) ;/ 定义File类对象if (! file.getParentFile().exists() / 父文件夹不
20、存在file.getParentFile().mkdirs() ;/ 创建文件夹Scanner scan = null ;/ 扫描输入try scan = new Scanner(new FileInputStream(file) ;/ 实例化Scannerwhile(scan.hasNext()/ 循环读取this.msg.append(scan.next() + n) ;/ 设置文本 catch (Exception e) e.printStackTrace(); finally if (scan != null) scan.close() ;/ 关闭打印流 else / SDCard不存
21、在,使用Toast提示用户Toast.makeText(this, 读取失败,SD卡不存在!,Toast.LENGTH_LONG).show();E-MAIL读取资源文件在Android操作系统之中,也可以进行一些资源文件的读取,这些资源文件的ID都会自动的通过R.java这个类生成,如果要对这些文件读取,使用android.content.res.Resources类即可完成Resources类的方法:public InputStream openRawResource(int id)E-MAIL:保存资源文件现在有一个mybook.txt文件,要想通过Resour
22、ces类读取此文件的内容, 则需要将mybook.txt文件保存在res/raw文件夹之中E-MAIL:定义布局管理器 main.xmlE-MAIL:布局管理器高度为屏幕高度组件高度为文字高度定义Activity程序 MyResourcesOperateE-MAIL:package org.lxh;import java.io.IOException; import java.io.InputStream; import java.util.Scanner; import android.app.Activity;i
23、mport android.content.res.Resources;import android.os.Bundle;import android.widget.TextView;public class MyResourcsOperate extends Activity private TextView msg = null; Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);/ 父类onCreate()super.setContentView(R.lay
24、out.main);/ 定义布局管理器this.msg = (TextView) super.findViewById(R.id.msg);/ 找到组件Resources res = super.getResources();/ 操作资源InputStream input = res.openRawResource(R.raw.mybook);/ 读取资源ID Scanner scan = new Scanner(input);/ 实例化ScannerStringBuffer buf = new StringBuffer();/ 接收数据while (scan.hasNext() / 循环读取
25、buf.append(scan.next().append(n);/ 保存数据scan.close();/ 关闭输入流try / 关闭输入流input.close() ; catch (IOException e) e.printStackTrace();this.msg.setText(buf.toString();/ 设置文字DOM操作使用文件保存数据固然很方便,但是如果现在数据较多的话,则管理起来就不方便了,所以在使用文件保存时,也往往会采用XML文件形式进行数据的保存,而一旦使用XML操作,那么就肯定需要对XML文件进行解析, 而DOM解析就是最常用的一种。E-MAIL:mldnqa1
26、63.com范例:要输出的XML文件E-MAIL:李兴华范例:定义DOM操作E-MAIL:布局管理器高度为屏幕高度定义表格行默认显示文字组件高度为文字高度表格行完结定义表格行默认显示文字组件高度为文字高度表格行完结定义表格行默认显示文字范例:定义Activity程序(A)E-MAIL:package org.lxh.demo;import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parser
27、s.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerConfigurationException;import javax.xml.transform.TransformerException; import javax.xml.transform.Trans
28、formerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document;import org.w3c.dom.Element; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.view.View;import android.view.View.OnC
29、lickListener;import android.widget.Button;import android.widget.TextView;public class MyDOMDemo extends Activity private TextView name = null;/ 文本输入组件private TextView email = null;/ 文本输入组件private Button but = null;/ 按钮组件Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInst
30、anceState); super.setContentView(R.layout.main);/ 调用布局管理器 = (TextView) super.findViewById(R.) ;/ 取得组件this.email = (TextView) super.findViewById(R.id.email) ;/ 取得组件this.but = (Button) super.findViewById(R.id.but) ;/ 取得组件this.but.setOnClickListener(new OnClickListenerImpl() ;/ 设置范例:定义A
31、ctivity程序(B)E-MAIL:private class OnClickListenerImpl implements OnClickListener Overridepublic void onClick(View view) if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)/ 如果sdcard不存在return ;/ 返回被调用处File file = new File(Environment.getExternalStorageDirectory().t
32、oString()+ File.separator+ mldndata + File.separator + member.xml) ;/ 定义File类对象if (! file.getParentFile().exists() / 父文件夹不存在file.getParentFile().mkdirs() ;/ 创建文件夹DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = null;try builder = factory.newDocumentBui
33、lder(); catch (ParserConfigurationException e) e.printStackTrace();Document doc = null;doc = builder.newDocument();/ 创建一个新的文档Element addresslist = doc.createElement(addresslist) ;/ 建立节点Element linkman = doc.createElement(linkman) ;/ 建立节点Element name = doc.createElement(name) ;/ 建立节点Element email = d
34、oc.createElement(email) ;/ 建立节点name.appendChild(doc.createTextNode(MyDOMD.getText().toString();/ 设置文本email.appendChild(doc.createTextNode(MyDOMDemo.this.email.getText().toString() ;/ 设置文本linkman.appendChild(name) ;/ 子节点linkman.appendChild(email) ;/ 子节点addresslist.appendChild(linkman) ;/
35、 子节点doc.appendChild(addresslist) ;/ 文档上保存节点范例:定义Activity程序(C)E-MAIL:/ 7、输出文档到文件之中TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = null;try t = tf.newTransformer(); catch (TransformerConfigurationException e1) e1.printStackTrace();t.s etOutputProperty(OutputKeys.
36、ENCODING, GBK) ;/ 设置编码DOMSource source = new DOMSource(doc);/ 输出文档StreamResult result = new StreamResult(file);/ 指定输出位置try t.t ransform(source, result);/ 输出 catch (TransformerException e) e.printStackTrace();读取XML之前生成的XML文件E-MAIL:范例:定义布局管理器 main.xmlE-MAIL:布局管理器高度为屏幕高度定义表格行默
37、认显示文字组件高度为文字高度表格行完结定义表格行默认显示文字组件高度为文字高度表格行完结定义表格行默认显示文字范例:定义Activity程序,采用DOM解析,读取数据(A)E-MAIL:package org.lxh.demo;import java.io.File;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfi
38、gurationException; import org.w3c.dom.Document;import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.view.View;import android.view.View.OnClickListener;import andr
39、oid.widget.Button;import android.widget.TextView;public class MyDOMDemo extends Activity private TextView name = null;/ 文本输入组件private TextView email = null;/ 文本输入组件private Button but = null;/ 按钮组件Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); super.setCon
40、tentView(R.layout.main);/ 调用布局管理器 = (TextView) super.findViewById(R.) ;/ 取得组件this.email = (TextView) super.findViewById(R.id.email) ;/ 取得组件this.but = (Button) super.findViewById(R.id.but) ;/ 取得组件this.but.setOnClickListener(new OnClickListenerImpl() ;/ 设置范例:定义Activity程序,采用DOM解析,读取数据(B
41、):private class OnClickListenerImpl implements OnClickListener Overridepublic void onClick(View view) if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)/ 如果sdcard不存在return ;/ 返回被调用处File file = new File(Environment.getExternalStorageDirectory().toString()+ File.s
42、eparator+ mldndata + File.separator + member.xml) ;/ 定义File类对象if (! file.exists() / 父文件夹不存在return ;/ 返回被调用处 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = null;try builder = factory.newDocumentBuilder(); catch (ParserConfigurationException e) e.print
43、StackTrace();Document doc = null;try doc = builder.parse(file);/ 读取指定路径的xml文件 catch (SAXException e) e.printStackTrace(); catch (IOException e) e.printStackTrace();NodeList nl = doc.getElementsByTagName(linkman);for (int x = 0; x nl.getLength(); x+) / 循环输出节点内容Element e = (Element) nl.item(x) ;/ 取得每一个元素
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 术后并发症个案
- 中医基础理阴阳五行
- abt0506时间管理与工作统筹技巧
- ICU病人的安全管理
- 2026秋沪科版八年级物理 第一章 运动的世界综合能力检测题
- 【单元培优卷】Unit 6 Useful numbers 单元全真模拟培优卷-2026-2027学年三年级英语上册人教版(PEP)(新教材)(含答案解析)
- 公司行政后勤个人总结
- 2026北师大二下有多少个字新课标课件
- 2026年机械设计笔试题库及答案
- 氧气雾化吸入的常见并发症
- 滚针美容治疗技术解析
- 儿童自闭症康复中心项目商业计划书
- 莱州市月季产业发展规划(2018-2022年)
- 2025黑龙江七台河辰能生物质发电有限公司招聘笔试参考题库附带答案详解
- 中世纪欧洲大学的兴起与发展
- 《毛泽东思想和中国特色社会主义理论体系概论》附有答案
- 兰州市文职辅警招聘考试真题
- 田英章毛笔楷书2500字(简体版)
- 柴油机发电作业岗位职业危害告知卡
- 胰腺癌的影像诊断与鉴别诊断
- GCP培训教学讲解课件
评论
0/150
提交评论