Android数据存储之Internal Storage内部存储

本文介绍了Android设备的内部存储和外部存储的区别,重点讨论了内部存储的特点,包括无需权限即可使用,用户不可见且通常其他应用无法访问。当应用卸载时,内部存储的文件会被删除,适合存储私密数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

所有 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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值