Android内部存储与外部存储的示例讲解

 更新时间:2023年03月20日 11:27:23   作者:Dormiveglia-flx  
内部存储和外部存储的概念随着Android版本的更新也在发生不断的变化。最早的内部存储指的是系统自带的ROM存储,外部存储指的是外置的Sdcard或者通过OTG挂在的USB存储

什么是内部存储和外部存储

1.内部存储与外部存储的存储介质:

内部存储的介质:RAM(内存) + 内部ROM

外部存储的介质:外部ROM + SDCard(TS卡等等)。

2.内部存储与外部存储的存储特点:

一般来说,以/data开头的是内部存储。且内部存储不需要任何权限。

例如:

  • /data/data/< applicationId >/shared_prefs
  • /data/data/< applicationId >/databases
  • /data/data/< applicationId >/files // 通过context.getFilesDir() 获取该目录
  • /data/data/< applicationId >/cache //通过context.getCacheDir() 获取该目录

内部存储需要关注的文件夹:

app文件夹(未root无法打开):存放着所有app的apk文件夹

data文件夹:内部都是app的包名,存储着应用程序相关的数据,例如 data/data/包名/(shared_prefs、database、files、cache)

Android SDK提供了几个常见的内部存储文件的权限

  • Context.MODE_PRIVATE :私有方式存储,其他应用无法访问,覆盖旧的同名文件
  • Context.MODE_APPEND:私有方式存储,若有旧的同名文件,则在该文件上追加数据

一般来说,外部存储会放在storage文件夹下或者mnt文件夹下。且需要安卓的权限。

例如:

私有外部存储

  • /storage/emulated/0/Android/data/< applicationId >/files/Music //Context.getExternalFilesDir() 包含如Music等文件夹
  • /storage/emulated/0/Android/data/< applicationId >/cache //Context.getExternalCacheDir 外部缓存文件

以及共有外部存储

/storage/emulated/0 Environment.getExternalStorageDirectory()

/storage/emulated/0/Pictures

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)

外部存储需要注意的文件夹即外部存储的分类:

storage中有一个sdcard文件夹,sdcard下面可以分两类存储:

外部共有存储(共有目录):里面常见的有Pictures、Download等文件夹.

外部私有存储(私有目录):系统中的数据。

内部存储与外部存储的文件夹:

3.内部存储与外部存储,释放内存方面的总结:

内部存储:随应用卸载被删除。外部存储:

1.公有目录:存放一些下载的视频文件等,比如还有movies,fictures,music等公有的一些文件目录。

2.私有目录:随应用卸载被删除。

内部存储与外部存储的代码示例

内部存储

				// 存
 				FileOutputStream fos = null;
                try {
                    //第一个参数:文件名
                    //第二个参数:表示文件输出的类型 这里选择Context.MODE_PRIVATE每次生成相同的文件名,则覆盖原有的文件
                    fos = openFileOutput('test', Context.MODE_PRIVATE);
                    String nameAndPassword = username + "." + password;
                    byte[] bytes = nameAndPassword.getBytes();
                    fos.write(bytes);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (fos != null) {
                        try {
                            fos.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
				// 取
				FileInputStream fis = null;
                try {
                    fis = openFileInput(fileName);
                    //fis.available() 判断文件有多少个字节
                    byte[] bytes = new byte[fis.available()];
                    while (fis.read(bytes) != -1) {
                        String message = new String(bytes);
                        String[] split = message.split("\\.");
                        tv_message.setText("用户名:" + split[0] + "\n" + "密码:" + split[1]);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

外部存储

// 获取外部存储地址的位置并创建文件:
new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
				// 存
				OutputStream outputStream = null;
                try {
                        outputStream = new FileOutputStream(new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), 'test2'));
                        String nameAndPassword = username + "." + password;
                        byte[] bytes = nameAndPassword.getBytes();
                        outputStream.write(bytes);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (outputStream != null) {
                        try {
                            outputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
				// 取
				 FileInputStream fis = null;
                try {
                    //第一个参数:文件目录 第二个参数:文件名
                    //getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)对应的路径为:
                    // /storage/emulated/0/Android/data/com.example.customviewproject/files/Download
                    File file = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), fileName);
                        fis = new FileInputStream(file);
                        //判断当前文件的字节个数
                        byte[] bytes = new byte[fis.available()];
                        while (fis.read(bytes) != -1) {
                            String message = new String(bytes);
                            String[] split = message.split("\\.");
                            tv_message.setText("用户名:" + split[0] + "\n" + "密码:" + split[1]);
                        }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (fis != null) {
                        try {
                            fis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }

到此这篇关于Android内部存储与外部存储的示例讲解的文章就介绍到这了,更多相关Android内部存储与外部存储内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android Service启动流程刨析

    Android Service启动流程刨析

    这几天分析了一下的启动过程,于是乎,今天写一下Service是如何启动的; 给我的感觉是这些启动过程并不复杂,千万不要被一坨一坨的代码吓住了,虽然弯弯绕绕不少,重载函数一个接着一个,就向走迷宫一样,但只要抓住主线阅读,很快就能找到出口
    2022-08-08
  • Android应用中绘制圆形头像的方法解析

    Android应用中绘制圆形头像的方法解析

    这篇文章主要介绍了Android应用中绘制圆形头像的方法解析,文后还顺带介绍了Android App常用图标尺寸规范,需要的朋友可以参考下
    2016-02-02
  • Android 动态显示和隐藏状态栏详解及实例

    Android 动态显示和隐藏状态栏详解及实例

    这篇文章主要介绍了Android 动态显示和隐藏状态栏的相关资料,需要的朋友可以参考下
    2017-06-06
  • Android实现自动播放图片功能

    Android实现自动播放图片功能

    这篇文章主要为大家详细介绍了Android实现自动播放图片功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Flutter启动流程的深入解析

    Flutter启动流程的深入解析

    这篇文章主要给大家介绍了关于Flutter启动流程的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Flutter具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • Android入门之计时器Chronometer的使用教程

    Android入门之计时器Chronometer的使用教程

    Chronometer是一个简单的定时器,你可以给它一个开始时间,并以此定时。本文将利用个简单的示例为大家讲解一下它的使用,感兴趣的小伙伴可以尝试一下
    2022-11-11
  • Android App中进行语言的切换

    Android App中进行语言的切换

    这篇文章主要介绍了Android App中如何进行语言的切换,帮助大家更好的理解和学习使用Android app,感兴趣的朋友可以了解下
    2021-03-03
  • Android入门之使用RecyclerView完美实现瀑布流界面详解

    Android入门之使用RecyclerView完美实现瀑布流界面详解

    网上充满着不完善的基于RecyclerView的瀑布流实现,要么根本是错的、要么就是只知其一不知其二。本文就来用RecyclerView完美实现瀑布流界面,希望大家有所帮助
    2023-02-02
  • 详解Android的Handler机制原理

    详解Android的Handler机制原理

    Android的Handler机制是一种用于处理和调度线程之间消息传递的机制,通常用于在后台线程中执行任务,并将结果返回到主线程中更新UI,Handler机制的核心是Message和MessageQueue,以及Looper,本文给大家详细讲解了Android的Handler机制原理,需要的朋友可以参考下
    2023-10-10
  • 基于Android Flutter编写贪吃蛇游戏

    基于Android Flutter编写贪吃蛇游戏

    贪吃蛇是一款足够经典的游戏。本文将利用Android中的Flutter编写这一经典的小游戏,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-03-03

最新评论