android開發框架(二)數據持久化(1)-文件存儲

android數據存儲主要有文件存儲(如內部存儲和外部存儲:SDCard),SQLite,sharedpreference,contentprovider幾種方式。

一丶文件存儲

文件存儲方式因Android設備的自帶內存和外置SDCard而分爲Internal Storage和External Storage。

Internal Storage

內部存儲,在Android開發中可以直接使用設備的內部存儲器中保存文件,默認情況下,以這種方式保存的和數據是隻能被當前程序訪問,文件保存在本程序對應的路徑下,在其他程序中是無法訪問到的,而當用戶卸載該程序的時候,這些文件也會隨之被刪除。

  使用內部存儲保存數據的方式,基本上也是先獲得一個文件的輸出流,然後以write()的方式把待寫入的信息寫入到這個輸出流中,最後關閉流即可,這些都是Java中IO流的操作。具體步驟如下:

  • 使用Context.openFileOutput()方法獲取到一個FileOutputStream對象。

  • 把待寫入的內容通過write()方法寫入到FileOutputStream對象中。

  • 最後close()關閉流。
/**
     * 保存內容到內部存儲器中
     * @param filename 文件名
     * @param content 內容
     */
    public void save(String filename, String content) throws IOException {
        // FileOutputStream fos=context.openFileOutput(filename,
        // Context.MODE_PRIVATE);
        File file = new File(context.getFilesDir(), filename);
        FileOutputStream fos = new FileOutputStream(file);

        fos.write(content.getBytes());
        fos.close();
    }
 /**
     *  通過文件名獲取內容
     * @param filename 文件名
     * @return 文件內容
     */
    public String get(String filename) throws IOException {
        FileInputStream fis = context.openFileInput(filename);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] data = new byte[1024];
        int len = -1;
        while ((len = fis.read(data)) != -1) {
            baos.write(data, 0, len);
        }
        return new String(baos.toByteArray());
    }
 /**
     * 以追加的方式在文件的末尾添加內容
     * @param filename 文件名
     * @param content 追加的內容
     */
    public void append(String filename, String content) throws IOException {
        FileOutputStream fos = context.openFileOutput(filename,
                Context.MODE_APPEND);
        fos.write(content.getBytes());
        fos.close();
    }

External Storage

使用外部存儲實現數據持久化,這裏的外部存儲一般就是指的是sdcard。使用sdcard存儲的數據,不限制只有本應用訪問,任何可以有訪問Sdcard權限的應用均可以訪問,而Sdcard相對於設備的內部存儲空間而言,會大很多,所以一般比較大的數據,均會存放在外部存儲中。

相比較於內部存儲方式,外部存儲有幾個方面需要注意:

  • 判斷SDCard是否存在且可用,
    獲取是否存在有效的Sdcard,使用的是Environment.getExternalStorageState()方法

  • 獲取存儲文件的路徑,可以先獲取文件的根路徑
    使用Envir.getExternalStorageDirectory()方法獲取當Sdcard的根目錄,可以通過它訪問到相應的文件

  • 在AndroidManifest文件中添加讀寫外部文件權限
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
/**
     * 寫入文件方法
     * 
     * @param content
     */
    public static void write(String content) {
        try {
            if (Environment.getExternalStorageState().equals(
                    Environment.MEDIA_MOUNTED)) {
                File sdCardDir = Environment.getExternalStorageDirectory();
                String dirPath = sdCardDir.getCanonicalPath() + File.separator
                        + path;
                File dir = new File(dirPath);
                if (!dir.exists()) {
                    dir.mkdirs();
                }
                File targetFile = new File(dirPath + File.separator
                        + CrashInfoFile);
                RandomAccessFile raf = new RandomAccessFile(targetFile, "rw");
                raf.seek(targetFile.length());
                raf.write(content.getBytes());
                raf.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
/**
     * 讀取SDcard文件
     */
    public static String readSDcard() {
        StringBuffer str = new StringBuffer();
        try {
            if (Environment.getExternalStorageState().equals(
                    Environment.MEDIA_MOUNTED)) {
                File file = new File(Environment.getExternalStorageDirectory()
                        .getCanonicalPath()
                        + File.separator
                        + path
                        + File.separator + CrashInfoFile);
                if (file.exists()) {
                    // 打開文件輸入流
                    FileInputStream fileR = new FileInputStream(file);
                    BufferedReader reads = new BufferedReader(
                            new InputStreamReader(fileR));
                    String st = null;
                    while ((st = reads.readLine()) != null) {
                        str.append(st + "\n");
                    }
                    fileR.close();
                } else {
                }
            } else {
                System.out.println("SD卡不存在!!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return str.toString();
    }
/**
     * 刪除文件
     */

    public static void deleteSDcard() {
        try {
            File f = new File(Environment.getExternalStorageDirectory()
                    .getCanonicalPath() + File.separator + path);
            File f2 = new File(Environment.getExternalStorageDirectory()
                    .getCanonicalPath()
                    + File.separator
                    + path
                    + File.separator + ScreenShotFile);
            if (f.exists()) {
                File[] fl = f.listFiles();
                for (int i = 0; i < fl.length; i++) {
                    if (fl[i].toString().endsWith(".txt")
                            || fl[i].toString().endsWith(".TXT")) {
                        if (fl[i].delete()) {
                            Log.e("DeleteSDcard-CrashInfo.txt", "Success。。。");
                        } else {
                            Log.e("DeleteSDcard-CrashInfo.txt", "Faild。。。");
                        }
                    }
                }
            }
            if (f2.exists()) {
                File[] fp = f2.listFiles();
                for (int i = 0; i < fp.length; i++) {
                    if (fp[i].toString().endsWith(".png")
                            || fp[i].toString().endsWith(".PNG")) {
                        if (fp[i].delete()) {
                            Log.e("DeleteSDcard-ScreenShot.png", "Success。。。");
                        } else {
                            Log.e("DeleteSDcard-ScreenShot.png", "Faild。。。");
                        }
                    }
                }
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

PS:對於現在市面上很多Android設備,自帶了一個大的存儲空間,一般是8GB或16GB,並且又支持了Sdcard擴展,對於這樣的設備,使用Enviroment.getExternalStorageDirectory()方法只能獲取到設備自帶的存儲空間,對於另外擴展的Sdcard而言,需要修改路徑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章