Android 數(shù)據(jù)存儲(二)文件存儲

轉(zhuǎn)載請注明出處:http://www.reibang.com/p/21b266d6b6d7

之前說了下Android中Sharedpreferences、SQLite Databases的使用一疯,不太會這兩個的可以參考這兩篇文章:
[Android 數(shù)據(jù)存儲 (一)SharedPreferences]乒裆、
[Android 數(shù)據(jù)存儲 (三)SQLite Databases]初嘹。
這篇主要說一下文件存儲(內(nèi)部存儲和外部存儲)意述。


1 Internal Storage

Internal Storage:內(nèi)部存儲器。
我們可以直接將文件保存在設(shè)備的內(nèi)部存儲設(shè)備上。默認情況下城舞,保存到內(nèi)部存儲的文件對您的應(yīng)用程序是私有的,其他應(yīng)用程序無法訪問它們(用戶也不可以)忙灼。當用戶卸載您的應(yīng)用程序時匠襟,這些文件將被刪除。

創(chuàng)建和寫入私有文件到內(nèi)部存儲

String content = "abcdefghigk";
try {
    FileOutputStream os = openFileOutput("internal.txt", MODE_PRIVATE);
    //寫數(shù)據(jù)
    os.write(content.getBytes());
    os.close();//關(guān)閉文件
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
  1. 調(diào)用openFileOutput()该园,參數(shù):文件的名稱和操作模式酸舍。這返回一個FileOutputStream。該方式創(chuàng)建的文件路徑為:/data/data/<包名>/files/目錄下里初。
  2. write()將字符串寫入文件啃勉。
  3. close()關(guān)閉輸出流。

文件操作模式有以下四種:

  • MODE_PRIVATE 將創(chuàng)建文件(或替換相同名稱的文件)双妨,并使其對您的應(yīng)用程序是私有的淮阐。
  • MODE_APPEND 如果文件已經(jīng)存在,則將數(shù)據(jù)寫入現(xiàn)有文件的末尾刁品,而不是將其刪除泣特。
  • MODE_WORLD_READABLE 可讀(不建議)
  • MODE_WORLD_WRITEABLE 可寫(不建議)

從內(nèi)部存儲讀取文件

byte buffer[] = new byte[4096];
try {
    FileInputStream in = openFileInput("internal.txt");
    //將數(shù)據(jù)讀到buffer.
    int len = in.read(buffer);
    in.close();//關(guān)閉文件
    Log.i(TAG, "buffer="+new String(buffer,0,len));
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
  1. 調(diào)用openFileInput()并傳遞要讀取的文件的名稱。這返回一個FileInputStream挑随。
  2. 從文件中讀取字節(jié)read()状您。
  3. 然后關(guān)閉流 close()。

如果要在編譯時保存應(yīng)用程序中的靜態(tài)文件兜挨,請將該文件保存在項目res/raw/目錄中膏孟。您可以打開它 openRawResource(),傳遞資源ID(R.raw.<filename>)拌汇。此方法返回一個 可用于讀取文件(但不能寫入原始文件)的 InputStream實例柒桑。

保存緩存文件

如果您想緩存一些數(shù)據(jù),而不是持久存儲担猛,那么您應(yīng)該使用它getCacheDir()來打開File代表應(yīng)用程序應(yīng)該保存臨時緩存文件的內(nèi)部目錄幕垦。

當設(shè)備的內(nèi)部存儲空間不足時,Android可能會刪除這些緩存文件以恢復空間傅联。但是先改,您不應(yīng)該依靠系統(tǒng)來清理這些文件。您應(yīng)該始終自己維護緩存文件蒸走,并保持在合理的空間上限仇奶,例如1MB。當用戶卸載您的應(yīng)用程序時,這些文件將被刪除该溯。

其他有用的方法

  • getFilesDir()
    獲取保存內(nèi)部文件的文件系統(tǒng)目錄的絕對路徑岛抄。
  • getDir()
    在內(nèi)部存儲空間內(nèi)創(chuàng)建(或打開現(xiàn)有的)目錄。
  • deleteFile()
    刪除保存在內(nèi)部存儲上的文件狈茉。
  • fileList()
    返回應(yīng)用程序當前保存的文件數(shù)組夫椭。

2 External Storage

每個Android兼容設(shè)備都支持一個共享的“外部存儲”,您可以使用它來保存文件氯庆。這可以是可移動存儲介質(zhì)(例如SD卡)或內(nèi)部(不可移動)存儲蹭秋。保存到外部存儲器的文件是可讀的,用戶可以在使用USB大容量存儲在計算機上傳輸文件時進行修改堤撵。

注意:如果用戶將外部存儲器安裝在計算機上或刪除了介質(zhì)仁讨,則外部存儲可能會變得不可用,并且您保存到外部存儲器的文件沒有執(zhí)行安全性实昨。所有應(yīng)用程序都可以讀取和寫入放在外部存儲上的文件洞豁,用戶可以將其刪除。

訪問外部存儲

為了在外部存儲上讀取或?qū)懭胛募母膽?yīng)用程序必須獲取 <font color =blue>READ_EXTERNAL_STORAGE </font><font color =blue>WRITE_EXTERNAL_STORAGE</font>系統(tǒng)權(quán)限丈挟。例如:

<uses-permission android:name = “android.permission.READ_EXTERNAL_STORAGE” />
<uses-permission android:name = “android.permission.WRITE_EXTERNAL_STORAGE” />

如果您需要讀取和寫入文件,則需要僅請求 WRITE_EXTERNAL_STORAGE權(quán)限志电,因為它隱含地還需要讀取訪問權(quán)限礁哄。

注意:從Android 4.4開始,如果您正在閱讀或僅寫入您的應(yīng)用程序的私有文件溪北,則不需要這些權(quán)限桐绒。

檢查媒體可用性

在對外部存儲進行任何處理之前,應(yīng)始終調(diào)用getExternalStorageState()以檢查介質(zhì)是否可用之拨。介質(zhì)可能安裝到計算機茉继,丟失,只讀或處于某種其他狀態(tài)蚀乔。這里有幾種可用于檢查可用性的方法:

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;
    }
    return false;
}

該getExternalStorageState()方法返回您可能想要檢查的其他狀態(tài)烁竭,如媒體是否被共享(連接到計算機),完全丟失吉挣,已被刪除等等派撕。您可以使用這些來通知用戶更多信息您的應(yīng)用程序需要訪問媒體。
保存可與其他應(yīng)用共享的文件

從媒體掃描器隱藏您的文件

通常睬魂,用戶可以通過應(yīng)用程序獲取的新文件應(yīng)該保存到其他應(yīng)用可以訪問的設(shè)備上的“公共”位置终吼,用戶可以輕松地從設(shè)備中復制它們。這樣做時氯哮,你應(yīng)該使用的共享的公共目錄际跪,如之一Music/,Pictures/和Ringtones/。

為了得到一個File較合適的公共目錄姆打,呼叫g(shù)etExternalStoragePublicDirectory()良姆,通過它你想要的目錄的類型,如 DIRECTORY_MUSIC幔戏,DIRECTORY_PICTURES玛追, DIRECTORY_RINGTONES,或其他闲延。通過將文件保存到相應(yīng)的媒體類型目錄豹缀,系統(tǒng)的媒體掃描器可以對系統(tǒng)中的文件進行適當?shù)姆诸悾ɡ纾徛曉谙到y(tǒng)設(shè)置中顯示為鈴聲慨代,而不是音樂)。

例如啸如,以下是在公共圖片目錄中為新相冊創(chuàng)建目錄的方法:

public File getAlbumStorageDir(String albumName) {
    // Get the directory for the user's public pictures directory.
    File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES), albumName);
    if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
    }
    return file;
}

保存專用的文件

如果您正在處理不適用于其他應(yīng)用程序的文件(例如只有您的應(yīng)用程序使用的圖形紋理或聲音效果)侍匙,則應(yīng)通過調(diào)用在外部存儲上使用專用存儲目錄getExternalFilesDir()。此方法還需要一個type參數(shù)來指定子目錄的類型(如DIRECTORY_MOVIES)叮雳。如果您不需要特定的媒體目錄想暗,請傳遞null以接收您應(yīng)用的私有目錄的根目錄。

從Android 4.4開始帘不,在應(yīng)用程序的私有目錄中讀取或?qū)懭胛募恍枰猂EAD_EXTERNAL_STORAGE 或WRITE_EXTERNAL_STORAGE 權(quán)限说莫。因此,您可以通過添加maxSdkVersion 屬性來聲明只能在較低版本的Android上請求權(quán)限:

<uses-permission android:name = “android.permission.WRITE_EXTERNAL_STORAGE” android:maxSdkVersion = “18” />

注意: 當用戶卸載您的應(yīng)用程序時寞焙,此目錄及其所有內(nèi)容將被刪除储狭。此外,系統(tǒng)介質(zhì)掃描程序不會讀取這些目錄中的文件捣郊,因此它們無法從MediaStore內(nèi)容提供程序訪問辽狈。因此,您不應(yīng)將這些目錄用于最終屬于用戶的媒體呛牲,例如您的應(yīng)用程序捕獲或編輯的照片刮萌,或用戶使用您的應(yīng)用購買的音樂 - 這些文件應(yīng)保存在公共目錄中。

保存緩存文件

打開一個File,該File代表您應(yīng)該保存緩存文件的外部存儲目錄娘扩,請調(diào)用getExternalCacheDir()着茸。如果用戶卸載您的應(yīng)用程序,這些文件將被自動刪除琐旁。

提示: 要保留文件空間并保持應(yīng)用程序的性能涮阔,請務(wù)必仔細管理緩存文件,并在整個應(yīng)用程序的生命周期中刪除不再需要的緩存文件灰殴。


歡迎大家關(guān)注澎语、評論、點贊
你們的支持是我堅持的動力擅羞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尸变,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子减俏,更是在濱河造成了極大的恐慌召烂,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娃承,死亡現(xiàn)場離奇詭異奏夫,居然都是意外死亡,警方通過查閱死者的電腦和手機历筝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門酗昼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梳猪,你說我怎么就攤上這事麻削。” “怎么了春弥?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵呛哟,是天一觀的道長。 經(jīng)常有香客問我匿沛,道長扫责,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任逃呼,我火速辦了婚禮鳖孤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抡笼。我一直安慰自己淌铐,他們只是感情好,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布蔫缸。 她就那樣靜靜地躺著腿准,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拾碌。 梳的紋絲不亂的頭發(fā)上吐葱,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機與錄音校翔,去河邊找鬼弟跑。 笑死,一個胖子當著我的面吹牛防症,可吹牛的內(nèi)容都是我干的孟辑。 我是一名探鬼主播哎甲,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼饲嗽!你這毒婦竟也來了炭玫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤貌虾,失蹤者是張志新(化名)和其女友劉穎吞加,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尽狠,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡衔憨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了袄膏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片践图。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沉馆,靈堂內(nèi)的尸體忽然破棺而出码党,到底是詐尸還是另有隱情,我是刑警寧澤悍及,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站接癌,受9級特大地震影響心赶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缺猛,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一缨叫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荔燎,春花似錦耻姥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至座享,卻和暖如春婉商,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渣叛。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工丈秩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淳衙。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓蘑秽,卻偏偏與公主長得像饺著,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肠牲,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容