天天看點

Android資料存儲之Internal Storage内部存儲

前言:

所有 Android 裝置都有兩個檔案存儲區域:“内部”和“外部”存儲。這些名稱在 Android 早期産生,當時大多數裝置都提供内置的非易失性記憶體(内部存儲),以及移動存儲媒體,比如micro SD 卡(外部存儲)。一些裝置将永久性存儲空間劃分為“内部”和“外部”分區,即便沒有移動存儲媒體,也始終有兩個存儲空間,并且無論外部儲存設備是否可移動,API 的行為均一緻。

内部存儲的特點:

  1. 不必申請權限,始終可用
  2. 使用者不能通路
  3. 一般情況下,别的應用不能通路。隻有明确将檔案設定為可讀或可寫,并且别的應用知道您的應用的軟體包名稱和檔案名,才能通過程式設計通路。
  4. 當應用被解除安裝時,系統會從内部存儲中移除您的應用的所有檔案。
  5. 當您希望使用者或其他應用均無法通路您的檔案時,内部存儲是最佳選擇。

使用說明:

import android.content.Context;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class InternalStorage {
    /**
     * 得到内部存儲的根目錄:/data/data/包名/files
     */
    public static File getRootDir(Context context) {
        return context.getFilesDir().getAbsoluteFile();
    }

    /**
     * 向内部存儲根目錄下某個檔案寫入一個字元串
     */
    public static void writeString2File(Context context, String fileName, String content) {
        FileOutputStream outputStream = null;
        try {
            // fileName隻能是檔案名,不能包含目錄分隔符,該檔案若不存在會自動建立
            outputStream = context.openFileOutput(fileName, Context.MODE_PRIVATE);
            outputStream.write(content.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 讀取内部存儲根目錄下某個檔案的内容
     */
    public static String readStringFromFile(Context context, String fileName) {
        BufferedReader reader = null;
        StringBuffer buffer = new StringBuffer();
        String line = null;
        try {
            // fileName隻能是檔案名,不能包含目錄分隔符,該檔案若不存在FileNotFoundException
            reader = new BufferedReader(new InputStreamReader(context.openFileInput(fileName)));
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return buffer.toString();
    }

    /**
     * 得到内部緩存的根目錄:/data/data/包名/cache
     */
    public static File getCacheRootDir(Context context) {
        return context.getCacheDir().getAbsoluteFile();
    }

    /**
     * 向内部緩存根目錄下某個臨時檔案裡寫入一個字元串
     */
    public static void writeString2CacheFile(Context context, String fileName, String content) {
        FileOutputStream outputStream = null;
        File file = null;
        try {
            file = File.createTempFile(fileName, null, context.getCacheDir());
            outputStream = new FileOutputStream(file);
            outputStream.write(content.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 得到"/data/data/包名/"下名為app_dir的目錄(app_字首為系統自動添加),若不存在會自動建立
     */
    public static File getDir(Context context, String dir) {
        return context.getDir(dir, Context.MODE_PRIVATE);
    }

    /**
     * 删除"/data/data/包名/files/"下名為fileName的檔案,删除成功傳回true,否則傳回false
     * fileName隻能是檔案名,不能包含目錄分隔符
     */
    public static boolean deleteFile(Context context, String fileName) {
        return context.deleteFile(fileName);
    }
}