Android编程中FileOutputStream与openFileOutput()的区别分析
本文实例分析了android编程中fileoutputstream与openfileoutput()的区别。分享给大家供大家参考,具体如下:
openfileoutput()
首先给大家介绍使用文件如何对数据进行存储,activity提供了openfileoutput()方法可以用于把数据输出到文件中,具体的实现过程与在j2se环境中保存数据到文件中是一样的。
public void save() { try { fileoutputstream outstream=this.openfileoutput("a.txt",context.mode_world_readable); outstream.write(text.gettext().tostring().getbytes()); outstream.close(); toast.maketext(myactivity.this,"saved",toast.length_long).show(); } catch (filenotfoundexception e) { return; } catch (ioexception e){ return ; } }
openfileoutput()方法的第一参数用于指定文件名称,不能包含路径分隔符"/" ,如果文件不存在,android 会自动创建它。创建的文件保存在/data/data/<package name>/files目录,如: /data/data/cn.itcast.action/files/itcast.txt ,通过点击eclipse菜单"window"-"show view"-"other",在对话窗口中展开android文件夹,选择下面的file explorer视图,然后在file explorer视图中展开/data/data/<package name>/files目录就可以看到该文件。
openfileoutput()方法的第二参数用于指定操作模式,有四种模式,分别为: context.mode_private = 0
context.mode_append = 32768
context.mode_world_readable = 1
context.mode_world_writeable = 2
context.mode_private:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用context.mode_append
context.mode_append:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
context.mode_world_readable和context.mode_world_writeable用来控制其他应用是否有权限读写该文件。
mode_world_readable:表示当前文件可以被其他应用读取;mode_world_writeable:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入:
android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package name>/files),其他程序无法访问。除非在创建时指定了context.mode_world_readable或者context.mode_world_writeable ,只有这样其他程序才能正确访问。
读取文件内容
public void load() { try { fileinputstream instream=this.openfileinput("a.txt"); bytearrayoutputstream stream=new bytearrayoutputstream(); byte[] buffer=new byte[1024]; int length=-1; while((length=instream.read(buffer))!=-1) { stream.write(buffer,0,length); } stream.close(); instream.close(); text.settext(stream.tostring()); toast.maketext(myactivity.this,"loaded",toast.length_long).show(); } catch (filenotfoundexception e) { e.printstacktrace(); } catch (ioexception e){ return ; } }
对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定context.mode_world_readable和context.mode_world_writeable权限。
activity还提供了getcachedir()和getfilesdir()方法:
getcachedir()方法用于获取/data/data/<package name>/cache目录
getfilesdir()方法用于获取/data/data/<package name>/files目录
把文件放入sd卡
使用activity的openfileoutput()方法保存文件,文件是存放在手机空间上,一般手机的存储空间不是很大,存放些小文件还行,如果要存放像视频这样的大文件,是不可行的。对于像视频这样的大文件,我们可以把它存放在sdcard。 sdcard是干什么的?你可以把它看作是移动硬盘或u盘。
在模拟器中使用sdcard,你需要先创建一张sdcard卡(当然不是真的sdcard,只是镜像文件)。创建sdcard可以在eclipse创建模拟器时随同创建,也可以使用dos命令进行创建,如下:
在dos窗口中进入android sdk安装路径的tools目录,输入以下命令创建一张容量为2g的sdcard,文件后缀可以随便取,建议使用.img:
mksdcard 2048m d:\androidtool\sdcard.img
在程序中访问sdcard,你需要申请访问sdcard的权限。
在androidmanifest.xml中加入访问sdcard的权限如下:
<!– 在sdcard中创建与删除文件权限 –> <uses-permission android:name="android.permission.mount_unmount_filesystems"/> <!– 往sdcard写入数据权限 –> <uses-permission android:name="android.permission.write_external_storage"/>
要往sdcard存放文件,程序必须先判断手机是否装有sdcard,并且可以进行读写。
注意:访问sdcard必须在androidmanifest.xml中加入访问sdcard的权限
if(environment.getexternalstoragestate().equals(environment.media_mounted)){ file sdcarddir = environment.getexternalstoragedirectory();//获取sdcard目录 file savefile = new file(sdcarddir, "a.txt"); fileoutputstream outstream = new fileoutputstream(savefile); outstream.write("test".getbytes()); outstream.close(); }
environment.getexternalstoragestate()方法用于获取sdcard的状态,如果手机装有sdcard,并且可以进行读写,那么方法返回的状态等于environment.media_mounted。
environment.getexternalstoragedirectory()方法用于获取sdcard的目录,当然要获取sdcard的目录,你也可以这样写:
file sdcarddir = new file("/sdcard"); //获取sdcard目录 file savefile = new file(sdcarddir, "itcast.txt"); //上面两句代码可以合成一句: file savefile = new file("/sdcard/a.txt"); fileoutputstream outstream = new fileoutputstream(savefile); outstream.write("test".getbytes()); outstream.close();
最后附上一个使用openfileoutput的例子存取对象:
public class mainactivity extends activity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); } public void button(view view){ person p = new person(); p.setage(10); p.setname("lee"); saveobject(p, "mainactivity.dat"); } public void button2(view view){ person p = (person) readobject("mainactivity.dat"); system.out.println(p.getage()); } public boolean saveobject(serializable ser, string file) { fileoutputstream fos = null; objectoutputstream oos = null; try{ fos = openfileoutput(file, mode_private); oos = new objectoutputstream(fos); oos.writeobject(ser); oos.flush(); return true; }catch(exception e){ e.printstacktrace(); return false; }finally{ try { oos.close(); } catch (exception e) {} try { fos.close(); } catch (exception e) {} } } /** * 读取对象 * @param file * @return * @throws ioexception */ public serializable readobject(string file){ fileinputstream fis = null; objectinputstream ois = null; try{ fis = openfileinput(file); ois = new objectinputstream(fis); return (serializable)ois.readobject(); }catch(filenotfoundexception e){ }catch(exception e){ e.printstacktrace(); //反序列化失败 - 删除缓存文件 if(e instanceof invalidclassexception){ file data = getfilestreampath(file); data.delete(); } }finally{ try { ois.close(); } catch (exception e) {} try { fis.close(); } catch (exception e) {} } return null; } } class person implements serializable{ int age; string name; public int getage() { return age; } public void setage(int age) { this.age = age; } public string getname() { return name; } public void setname(string name) { this.name = name; } }
更多关于android相关内容感兴趣的读者可查看本站专题:《android开发入门与进阶教程》、《android数据库操作技巧总结》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。
推荐阅读
-
Android编程中FileOutputStream与openFileOutput()的区别分析
-
Android Activity中onStart()和onResume()的区别分析
-
C#中Monitor对象与Lock关键字的区别分析
-
Android开发之资源目录assets与res/raw的区别分析
-
C#中String与string的区别分析
-
PHP中isset与array_key_exists的区别实例分析_PHP
-
PHP中addslashes与mysql_escape_string的区别分析
-
Android编程中PopupWindow的用法分析【位置、动画、焦点】
-
mysql中char与varchar的区别分析
-
Android编程中的四大基本组件与生命周期详解