本文实例分析了android编程中fileoutputstream与openfileoutput()的区别。分享给大家供大家参考,具体如下:
openfileoutput()
首先给大家介绍使用文件如何对数据进行存储,activity提供了openfileoutput()方法可以用于把数据输出到文件中,具体的实现过程与在j2se环境中保存数据到文件中是一样的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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 ,只有这样其他程序才能正确访问。
读取文件内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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:
1
|
mksdcard 2048m d:\androidtool\sdcard.img |
在程序中访问sdcard,你需要申请访问sdcard的权限。
在androidmanifest.xml中加入访问sdcard的权限如下:
1
2
3
4
|
<!– 在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的权限
1
2
3
4
5
6
7
|
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的目录,你也可以这样写:
1
2
3
4
5
6
|
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的例子存取对象:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
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程序设计有所帮助。