Android的内部存储和外部存储

本文详细介绍了Android平台上的文件存储方式,包括内部存储和外部存储的区别、特点及操作方法。内部存储适用于保存敏感信息,而外部存储则更适合作为共享文件的存储地。

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

Android内部存储和外部存储

   Android 文件系统的操作分为内部存储和外部存储,内部存储就是占用手机内存的空间,外部存储就是占用其他空间。比如SDCard。

一、内部存储

内部存储的目录,只有自己应用程序才能访问,其他应用程序不能访问,这个目录就是/data/data/<包名> 这个目

录,当程序卸载,这个目录自动删除。内部存储是依赖于应用程序的,因此访问内部存储,必须是应用程序内部的

Context 上下文才可以打开。所以Context中也提供了几个方法方便我们来操作。


实例1:在应用程序的files文件夹下创建一个名称为newfile.txt的文件,并且往里面写入数据

private void writeSomeThing2Dir() {
        File filesDir = getFilesDir();
        if(!filesDir.exists()){
            filesDir.mkdir();
        }
        File newFile=new File(filesDir,"newfile.txt");
        if(!newFile.exists()){
            try {
                newFile.createNewFile();
                FileOutputStream  fos=new FileOutputStream(newFile);
                fos.write("不得了".getBytes());
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


实例2:在Files文件下创建子目录可行吗???

private void makeSubDirectory() {
        File filesDir = getFilesDir();
        File image=new File(filesDir,"image");
        if(!image.exists()){
            image.mkdirs();
        }
        try {
            //错误,这个方法只能打开files目录下的一级目录的文件
            FileOutputStream fos = openFileOutput("image/1.txt", MODE_PRIVATE);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

二、内部存储区的特点

1. 当应用程序被卸载的时候,应用程序手机内部存储区的文件,全部被删除;

2. 内部存储区中,有一个 cache 文件夹,存储的是临时的缓存文件,应用程序管理器可以通过ClearCache进行缓存的清空;通常都用于软件中“清空缓存”功能;

3. 在 cache 文件夹中的内容,当手机的内部存储空间已经被占满了,Android系统,就会⾃自动删除所有程序内部的 cache文件夹的内容。

4. 如果希望文件不被自动删掉,那么就存储在files目录。

5. 手机内部存储区还是比较小的,建议使用存储卡进行文件的存储。


三、外部存储

外部存储就是通常所有的Android程序都能够进行访问的,类似于存储卡的文件系统。存储卡存储目录:/mnt/sdcard,或者 /storage/sdcard。手机上和模拟器上

可能不同。在进行访问的时候,需要添加读取权限。

读权限:  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
写权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>,

一般我们写个写权限就OK了,据说以后可用要求开发者这两样都得加上,但是现在写一个就可以了。存储卡可能有,也可能没有,需要在处理外部存储的时候,需要进行判断,当前是否有存储卡。

下面看几个Environment的API

1.所有存储卡操作,都需要先进行判断有没有存储卡,下面这个方法用于判断存储卡的状态

public static String getExternalStorageState ()

2、获得外部存储的根目录  ----/storage/emulated/0  第0个

public static File getExternalStorageDirectory ()

3、获取存储卡某个特定的文件,比如音乐、视频、图片。。。

public static File getExternalStoragePublicDirectory (String type)

type的类型有:DIRECTORY_MUSIC, DIRECTORY_PODCASTS, DIRECTORY_RINGTONES,DIRECTORY_ALARMS, DIRECTORY_NOTIFICATIONS,DIRECTORY_PICTURES, DIRECTORY_MOVIES,DIRECTORY_DOWNLOADS, or DIRECTORY_DCIM. Maynot be null.

4.获取私有的程序目录,如果参数传入null,结果是files目录,路径是/storage/emulated/0/Android/data/包名/files,

如果参数传入是个特定的字符串,比如wangjing,结果是files目录的子目录,路径是/storage/emulated/0/Android/data/包名/files/wangjing

public File getExternalFilesDir (String type)

四、文件存储的最佳实践

关于文件操作,在应用中一般都会有一个清除缓存这个功能,这个功能就是文件操作实现的:显示缓存大小,要递归循环缓存文件夹下所有文件大小,然后求和。清除缓存,要递归删除文件。注意:递归删除代码和获取缓存大小代码,这个两个方法要在子线程中做。
	/**
     * 递归删除文件和文件夹
     *
     * @param file 要删除的根目录
     */
    public static void recursionDeleteFile(File file) {
        if (file.isFile()) {
            file.delete();
            return;
        }
        if (file.isDirectory()) {
            File[] childFile = file.listFiles();
            if (childFile == null || childFile.length == 0) {
                file.delete();
                return;
            }
            for (File f : childFile) {
                recursionDeleteFile(f);
            }
        }
    }
	
	
	/* @param f
    * @return
    * @throws Exception
    */
    public static long getFileSize(File f) throws Exception {
        long size = 0;
        File flist[] = f.listFiles();
        if (flist != null)
            for (int i = 0; i < flist.length; i++) {
                File subFile = flist[i];
                if (subFile.isDirectory()) {
                    size = size + getFileSize(subFile);
                } else {
                    size = size + subFile.length();
                }
            }
        return size;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值