天天看点

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);
    }
}