【有夢想的IT人】Android數(shù)據(jù)存儲之文件存儲

****接著上篇我們今天來搞一下數(shù)據(jù)5大儲存中的文件存儲****

大兄弟,上車嗎?

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

核心原理: Context提供了兩個方法來打開數(shù)據(jù)文件里的文件IO流 FileInputStream openFileInput(String name); FileOutputStream(String name , int mode);這兩個方法第一個參數(shù) 用于指定文件名,第二種方法里面的第二個參數(shù)指定打開文件的模式。
具體有以下值可選:
MODE_PRIVATE:為默認(rèn)操作模式,代表該文件是私有數(shù)據(jù),只能被應(yīng)用本身訪問,在該模式下,寫入的內(nèi)容會覆蓋原文件的內(nèi)容,如果想把新寫入的內(nèi)容追加到原文件中??? 以使用Context.MODE_APPEND
MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內(nèi)容,否則就創(chuàng)建新文件。
*** MODE_WORLD_READABLE***:表示當(dāng)前文件可以被其他應(yīng)用讀?。?br> MODE_WORLD_WRITEABLE:表示當(dāng)前文件可以被其他應(yīng)用寫入。
除此之外,Context還提供了如下幾個重要的方法:
getDir(String name , int mode):在應(yīng)用程序的數(shù)據(jù)文件夾下獲取或者創(chuàng)建name對應(yīng)的子目錄
File getFilesDir():獲取該應(yīng)用程序的數(shù)據(jù)文件夾得絕對路徑
String[] fileList():返回該應(yīng)用數(shù)據(jù)文件夾的全部文件

實際案例:交互界面沿用上圖

核心代碼如下:

public String read() {
        try {
            FileInputStream inStream = this.openFileInput("message.txt");
            byte[] buffer = new byte[1024];
            int hasRead = 0;
            StringBuilder sb = new StringBuilder();
            while ((hasRead = inStream.read(buffer)) != -1) {
                sb.append(new String(buffer, 0, hasRead));
            }

            inStream.close();
            return sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return null;
    }
    
    public void write(String msg){
        // 步驟1:獲取輸入值
        if(msg == null) return;
        try {
            // 步驟2:創(chuàng)建一個FileOutputStream對象,MODE_APPEND追加模式
            FileOutputStream fos = openFileOutput("message.txt",
                    MODE_APPEND);
            // 步驟3:將獲取過來的值放入文件
            fos.write(msg.getBytes());
            // 步驟4:關(guān)閉數(shù)據(jù)流
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

注意:openFileOutput()方法的第一參數(shù)用于指定文件名稱,不能包含路徑分隔符“/,如果文件不存在,Android 會自動創(chuàng)建它。創(chuàng)建的文件保存在/data/data/<package name>/files目錄,如: /data/data/cn.tony.app/files/message.txt,”

下面講解某些特殊文件讀寫需要注意的地方:
讀寫sdcard上的文件
其中讀寫步驟按如下進(jìn)行:
1、調(diào)用Environment的getExternalStorageState()方法判斷手機(jī)上是否插了sd卡,且應(yīng)用程序具有讀寫SD卡的權(quán)限,如下代碼將返回true Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
2、調(diào)用Environment.getExternalStorageDirectory()方法來獲取外部存儲器,也就是SD卡的目錄,或者使用"/mnt/sdcard/"目錄
3、使用IO流操作SD卡上的文件
注意點:手機(jī)應(yīng)該已插入SD卡,對于模擬器而言,可通過mksdcard命令來創(chuàng)建虛擬存儲卡,必須在AndroidManifest.xml上配置讀寫SD卡的權(quán)限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

案例代碼:

// 文件寫操作函數(shù)
    private void write(String content) {
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) { // 如果sdcard存在
            File file = new File(Environment.getExternalStorageDirectory()
                    .toString()
                    + File.separator
                    + DIR
                    + File.separator
                    + FILENAME); // 定義File類對象
            if (!file.getParentFile().exists()) { // 父文件夾不存在
                file.getParentFile().mkdirs(); // 創(chuàng)建文件夾
            }
            PrintStream out = null; // 打印流對象用于輸出
            try {
                out = new PrintStream(new FileOutputStream(file, true)); // 追加文件
                out.println(content);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (out != null) {
                    out.close(); // 關(guān)閉打印流
                }
            }
        } else { // SDCard不存在,使用Toast提示用戶
            Toast.makeText(this, "保存失敗,SD卡不存在!", Toast.LENGTH_LONG).show();
        }
    }

    // 文件讀操作函數(shù)
    private String read() {

        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) { // 如果sdcard存在
            File file = new File(Environment.getExternalStorageDirectory()
                    .toString()
                    + File.separator
                    + DIR
                    + File.separator
                    + FILENAME); // 定義File類對象
            if (!file.getParentFile().exists()) { // 父文件夾不存在
                file.getParentFile().mkdirs(); // 創(chuàng)建文件夾
            }
            Scanner scan = null; // 掃描輸入
            StringBuilder sb = new StringBuilder();
            try {
                scan = new Scanner(new FileInputStream(file)); // 實例化Scanner
                while (scan.hasNext()) { // 循環(huán)讀取
                    sb.append(scan.next() + "\n"); // 設(shè)置文本
                }
                return sb.toString();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (scan != null) {
                    scan.close(); // 關(guān)閉打印流
                }
            }
        } else { // SDCard不存在,使用Toast提示用戶
            Toast.makeText(this, "讀取失敗,SD卡不存在!", Toast.LENGTH_LONG).show();
        }
        return null;
    }

參考:http://www.cnblogs.com/ITtangtang/p/3920916.html

嗨~我是夏尼采,一個有夢想的IT男

每周輸出3篇有用的文章,目標(biāo)是簽約簡書。

如果文章對您有幫助,希望能點個贊或者關(guān)注我。

您的關(guān)注和點贊是對我最大的鼓勵,感謝您的閱讀

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容