Android存储(读取)之内存FilesDir存储

  • 数据存储到私有文件夹中:data/data/包名/files/

    这里写图片描述

  • 点击“清除数据”按钮可以删除data/data/包名/files/下的数据

    这里写图片描述

  // 把String保存到私有文件夹中:data/data/包名/files/
        StoreUtils.storeStringToFilesDir(this, "fileDir", "ha.txt");
        //读取data/data/包名/files/中的文件
        String data = StoreUtils.readStringFromFilesDir(new File(getFilesDir(), "ha.txt"));
 /**
     * 把数据存储到私有文件夹中
     * 默认目录:data/data/包名/files/
     * 1.同样上面的目录可以使用context.getFilesDir()来获取
     * 2.只有自己的应用程序可以访问该目录,其他应用程序无法访问该目录(私有文件夹)
     * 真实的手机data这个目录是打不开的(未root),这是为了保护隐私,系统做了权限设置
     */

    /**
     * 数据存储到私有文件夹中:data/data/包名/files/
     * @param context 上下文
     * @param content 要保存的内容Sting
     * @param fileName 保存内容的文件名称
     */
    public static void storeStringToFilesDir(Context context, String content, String fileName) {
        try {
            File file = new File(context.getFilesDir(), fileName);
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(content.getBytes());
            fos.close();
            Toast.makeText(context, "存储数据到FilesDir成功", Toast.LENGTH_SHORT).show();
        }  catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(context, "存储数据到FilesDir失败", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 从私有文件夹中数读取据:data/data/包名/files/
     * @param file  data/data/包名/files/下的文件
     * @return String内容
     */
    public static String readStringFromFilesDir(File file) {

            try {
                FileInputStream fis = new FileInputStream(file);
                BufferedReader br = new BufferedReader(new InputStreamReader(fis));
                String content = "";
                String tmp;
                while ((tmp = br.readLine()) != null) {
                    content += tmp;
                }
                br.close();
                fis.close();
                return content;
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                return "不存在此文件,请核对文件路径、文件名";
            } catch (Exception e) {
                e.printStackTrace();
                return "文件读取失败";
            }


    }
<think>嗯,用户想了解Android中的文件存储方法。首先,我需要回忆一下Android文件系统的基本结构。记得Android有内部存储和外部存储之分,可能还有分区存储的概念,特别是从Android 11开始的变化。 用户提到了参考引用里的内部存储路径是data/user/0/packageName,外部存储是storage/emulated/0/android/data/packageName。这说明需要区分应用私有目录和公共目录。可能还需要提到MediaStore和SAF(Storage Access Framework)吧? 首先,应该按存储类型分类:内部存储、外部私有存储、外部公共存储,以及分区存储的影响。然后,每种存储方式的使用方法,比如如何读写文件,需要的权限,不同Android版本的区别,比如Android 10及以上需要分区存储,可能要用MediaStore来访问公共文件。 还要注意权限问题,比如以前需要WRITE_EXTERNAL_STORAGE,但现在可能不需要了,特别是应用私有目录。可能需要给出代码示例,比如使用Context的getFilesDir(),或者Environment.getExternalStoragePublicDirectory(),不过后者可能已经被弃用了,应该用MediaStore代替。 另外,用户可能需要知道如何保不同类型的文件,比如图片、文档等。还有,如何处理外部存储的可用性检查,比如是否挂载。还有,在AndroidManifest.xml中声明权限,以及处理Scoped Storage带来的变化。 可能还需要提到缓目录的使用,比如getCacheDir()和getExternalCacheDir(),以及何时使用它们。此外,使用FileProvider来共享文件,避免FileUriExposedException。 用户可能的问题会涉及具体代码实现,比如如何读写内部存储,如何保到下载目录,或者如何处理权限请求。因此,在回答中需要分步骤说明,并给出示例代码,同时注意版本差异。 最后,生成的相关问题可能包括分区存储的影响、不同存储位置的优缺点、特定文件类型的保方法等。需要确保引用正确,特别是参考内容中的路径和分区存储的变化。</think>### Android文件存储方法教程 #### 一、存储类型与路径 1. **内部存储** - 路径:$data/user/0/\text{packageName}$(应用私有目录)[^1] - 特点:无需权限,应用卸载时数据自动清除 - 代码示例: ```kotlin val file = File(context.filesDir, "example.txt") file.writeText("内部存储示例") ``` 2. **外部私有存储** - 路径:$storage/emulated/0/Android/data/\text{packageName}$ - 特点:无需权限,可存储大型文件 - 代码示例: ```kotlin val externalDir = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS) val file = File(externalDir, "external_example.txt") ``` 3. **公共存储(分区存储)** - Android 11+ 需通过$MediaStore$访问公共目录(如DCIM、Downloads) - 权限要求: - Android 10+:声明$android:requestLegacyExternalStorage="true"$(仅限适配过渡期) - 部分场景需申请$READ_EXTERNAL_STORAGE$或$WRITE_EXTERNAL_STORAGE$ --- #### 二、关键API与代码实现 1. **基础文件操作** ```kotlin // 写入内部存储 context.openFileOutput("test.txt", Context.MODE_PRIVATE).use { it.write("Hello World".toByteArray()) } // 读取内部存储 context.openFileInput("test.txt").bufferedReader().use { Log.d("TAG", it.readText()) } ``` 2. **使用MediaStore保图片** ```kotlin val values = ContentValues().apply { put(MediaStore.Images.Media.DISPLAY_NAME, "photo.jpg") put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES) } } val uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values) uri?.let { contentResolver.openOutputStream(it)?.use { os -> bitmap.compress(Bitmap.CompressFormat.JPEG, 90, os) } } ``` --- #### 三、适配建议 1. **分区存储适配** - 优先使用$Context.getExternalFilesDir()$或$MediaStore$ - 访问其他应用文件时使用$Storage Access Framework$(SAF) - 示例代码: ```kotlin val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "image/*" } startActivityForResult(intent, REQUEST_CODE) ``` 2. **缓管理** - 临时文件建议使用$context.cacheDir$或$context.externalCacheDir$ - 定期清理:`context.deleteFile(fileName)`或`file.delete()` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值