欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SharedPreferences+File操作详解  

程序员文章站 2022-05-07 09:13:28
...

SharedPreferences+File操作详解
            
    
    
         以前只是在开发中使用,感觉没太注意它比较细的特性,再说在开发中很少用到比较细的特性,今天就把以前在开发中做的测试代码给贴出来吧:

SHAREDPREFERCENCES中文名为共享参数,大家应该耳熟能详了,它在ANDROID应用中主要的角色就是对其参数设置时做"活动",就像在外面WINDOWS中使用后缀为,INI格式保存的参数与在J2SE中使用PROPERTIES为后缀的格式保存参数一样,他在ANDROID系统中也是为了对其某属性或者小内容进行设置时所做的设置,只是它严格了它对读写权限的操作,在ANDROID中使用SHAREPREFERENCE时,你需要记住的是,它有四个权限供你操作,第一个是:MODE_APPEND只能对本应用说具有的权限,只是在写时是可以追加数据,如在已经的XML内容中追加XXX,但是他不提供其他应用对其生成的文件内容进行操作的权限,第二个是:MODE_PRIVATE也是只能针对本应用进行操作,但是他是不可以对其已经文件内容进行追加的,你每次执行它是,都会对其内容进行全部覆盖,这点请要注意,第三个是:MODE_WORLD_READABLE模式,此权限模式对其本应用生成的文件提供其他应用对其访问的操作权限,只是其他应用只能已读的方式对其进行操作,如果你想执行写的操作的话,你就会遭到拒绝,呵呵,如你真相通过其他应用来访问本应用通过SHAREDPREFERENCES生成的文件内容,请使用第四个:MODE_WORLD_WRITEABLE,简明的说他提供了其他应用对其本应用其文件的读写权限,这是你不但可以通过其他应用对其文件的读操作,也可以很方便的执行写操作,这也就使它在文件读取方面表现得很灵活多用,只是,不管怎么样,它最大的缺点就是只能对其很小的内容进行操作,不过这也是它相对来说比较好的优点,使用它更便捷与方面,如我们在做一些恶参数配置:网络端口,简单联系人属性,或者是提供某个参数的属性,我们都可以使用它来进行灵活的操作.

在上面我们谈论SharedPreferences后,下面我们继续来谈在ANDROID是怎么对其文件进行操作的,由于时间问题,我就简单介绍文件的写与读受权限模式的操作过程,我并没有贴上UI显示,只是使用ANDROIDTESTCASE类来做测试即可,在上面我们了解SHAREDPREFERENCES所具有的四个权限操作模式来实现对其参数的读写操作,以至于是否是允许不同应用之间的访问操作,在这里我们也不难知道,ANDROID里使用文件做读写的方式也是一样具有同等权限操作的,只是我们在操作读取时,SHAREDPREFERENCES使用的是getSharedPreferences(读|取文件名,权限模式),而在操作文件时是使用File流来操作,如写入与读取都会使用一个上下文对象获取Context.openInputStream(取文件名,权限模式),Context.openOutputSream(写文件名,权限模式),它同样可以设置MODE_APPEND,MODE_PRIVATE,MODE_WORLD_READABLE,MODE_WORLD_WRITEABLE这是个权限模式来操作,以至于在操作过程中与SHAREDPREFERENCES的权限操作模式基本一样,所以在这里也就不在熬术,只是我在做相应的操作时,请注意,如要填写其路径时,也就是文件路径,我们不应该写绝对路径,因为这样操作会很不方便,推介大家使用相对路径,如:Environment.getExternalStorageDirectory();来获取其当前文件保存的环境路径,为什么要这么做呢,如我们在之前的ANDROID2.1中默认保存的路径为/sdcard,在ANDROID2.2中这把/sdcard路径映射成了/mnt/sdcard,即使在ANDROID3.0中或者更上使用其他的路径的话,只要使用环境适配路径方式就可以很容易的对其匹配了,这些在开发中的细节还是比较重要的,希望大家都能注意一下,在下就是在使用文件读的时候有个小细节我再说一下,就是在使用FileInputStream file = Context.openFileInputSreeam()后,读取到流我们可以先把它按批写入进内存:ByteArrayOutputStream outStream.writer(buffer,0,len);这里使用了缓冲流机制,而且还使用临时内存存储机制,让其数据在读取时会显得更流畅,记住在关闭时请不要忘了关闭缓冲流,还有就是在这里可能会考虑到编码的问题,如果前面我以UTF-8来写的,这里我们只需要以STRING方式取就行了:return new String(data);在我的源码你有详细记载,你可以下载我的源码自己去测试一下,我把每个权限至不同应用之间的访问都做了代码编写与详细测试,希望能给那些初学者们做更好的了解,下面是我部分源码: /**
* 通过SharedPreferences保存文件
*/
private OnClickListener save_file = new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (i) {
case 1:
sharePrarams = getSharedPreferences(APPEND_PATH_FILE, MODE_APPEND);
editor = sharePrarams.edit();
editor.putInt("code", new Integer(code.getText().toString()));
editor.putString("name", name.getText().toString());
editor.putInt("age", new Integer(age.getText().toString()));
editor.putString("education", education.getText().toString());
editor.putString("address", address.getText().toString());
editor.putString("selfIntrodcation", selfIntrodcation.getText().toString());
editor.commit();
break;
case 2:
sharePrarams = getSharedPreferences(APPEND_PATH_FILE, MODE_PRIVATE);
editor = sharePrarams.edit();
editor.putInt("code", new Integer(code.getText().toString()));
editor.putString("name", name.getText().toString());
editor.putInt("age", new Integer(age.getText().toString()));
editor.putString("education", education.getText().toString());
editor.putString("address", address.getText().toString());
editor.putString("selfIntrodcation", selfIntrodcation.getText().toString());
editor.commit();
break;
case 3:
sharePrarams = getSharedPreferences(APPEND_PATH_FILE, MODE_READABLE);
editor = sharePrarams.edit();
editor.putInt("code", new Integer(code.getText().toString()));
editor.putString("name", name.getText().toString());
editor.putInt("age", new Integer(age.getText().toString()));
editor.putString("education", education.getText().toString());
editor.putString("address", address.getText().toString());
editor.putString("selfIntrodcation", selfIntrodcation.getText().toString());
editor.commit();
break;
case 4:
sharePrarams = getSharedPreferences(APPEND_PATH_FILE, MODE_WRITEABLE);
editor = sharePrarams.edit();
editor.putInt("code", new Integer(code.getText().toString()));
editor.putString("name", name.getText().toString());
editor.putInt("age", new Integer(age.getText().toString()));
editor.putString("education", education.getText().toString());
editor.putString("address", address.getText().toString());
editor.putString("selfIntrodcation", selfIntrodcation.getText().toString());
editor.commit();
break;
}
}
};

/**
* 1:读取其他应用以APPEND权限写入的数据:java.lang.NullPointerException
* 2:读取其他应用以PRIVATE权限写入的数据:java.lang.NullPointerException
* 3:读取其他应用以READABLE权限写入的数据:

* 4:读取其他应用以WRATEABLE权限写入的数据:
*/
public void readOtherAppFile() throws Exception{
switch (i) {
case 1:
Log.i(TAG, APPEND_PATH);
content = file.readOtherFile(APPEND_PATH);
Log.i(TAG, content);
break;
case 2:
Log.i(TAG, PRIVATE_PATH);
content = file.readOtherFile(PRIVATE_PATH);
Log.i(TAG, content);
break;
case 3:
Log.i(TAG, READABLE_PATH);
content = file.readOtherFile(READABLE_PATH);
Log.i(TAG,content);
break;
case 4:
Log.i(TAG, WREATABLE_PATH);
content = file.readOtherFile(WREATABLE_PATH);
Log.i(TAG, content);
break;
}
}
/**
* 1:以APPEND权限写入其他应用以APPEND权限的文件
* 2:以PRIVATE权限写入其他应用以APPEND权限的文件
* 3:以READABLE权限写入其他应用以APPEND权限的文件
* 4:以WRATEABLE权限写入其他应用以APPEND权限的文件
*/
public void saveOtherAppendFile() throws Exception{
Log.i(TAG, APPEND_PATH);
switch (i) {
case 1:
content = "two for append data!";
file.saveOtherAppendFile(APPEND_PATH, content);
Log.i(TAG, APPEND_PATH+"|"+content);
break;
case 2:
content = "two for private data!";
file.saveOtherPrivateFile(APPEND_PATH, content);
Log.i(TAG, APPEND_PATH+"|"+content);
break;
case 3:
content = "two for readable data!";
file.saveOtherReadableFile(APPEND_PATH, content);
Log.i(TAG, APPEND_PATH+"|"+content);
break;
case 4:
content = "two for writeable data!";
file.saveOtherWriteableFile(APPEND_PATH, content);
Log.i(TAG, APPEND_PATH+"|"+content);
break;
}
}