本文实例分析了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程序设计有所帮助。