以前只是在開發中使用,感覺沒太注意它比較細的特性,再說在開發中很少用到比較細的特性,今天就把以前在開發中做的測試代碼給貼出來吧:
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;
}
}