推广

Android 外部存储与内部存储详解

iseeyu2年前 (2024-02-21)推广132

2.3、获取外部存储私有目录(SDK 29)

之所以 getExternalStorageDirectory() 这个方法被废弃的原因就是,保存在这个目录下的数据即时应用被卸载了,这些数据依然会存在外部存储里面,而这些数据是很有可能成为垃圾数据的,这样对用户是非常不友好的,所以呢谷歌提供了 getExternalFilesDir() 和 getExternalCacheDir() 这两个方法来获取外部存储的私有目录,前一个存放需要长时间保存的数据,后一个就存一些临时数据,它们位于 SDCard/Android/data/包名/files(cache) 下面。我们用一个简单的例子来演示一下。

2.4、外部存储实例演示

这个例子也很简单,就是往这个目录下存一些数据再读出来,具体效果如下所示:

完整代码如下所示:

public class ExternalActivity extends AppCompatActivity {

    private EditText infoEdt;
    private TextView txt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_external);

        infoEdt = findViewById(R.id.info_edt);
        txt = findViewById(R.id.textView);
    }

    public void operate(View v) {
        String path = getExternalFilesDir(null).getAbsolutePath() + "/test.txt";
        Log.e("ExternalActivityTag", path);
        switch (v.getId()) {
            case R.id.save_btn:
                File file =  getExternalFilesDir(null);
                try {
                    if (!file.exists()) {
                        file.createNewFile();
                    }
                    FileOutputStream fos = new FileOutputStream(path, true);
                    String str = infoEdt.getText().toString();
                    fos.write(str.getBytes());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            case R.id.read_btn:
                try {
                    FileInputStream fis = new FileInputStream(path);
                    byte[] b = new byte[1024];
                    int len = fis.read(b);
                    String str2 = new String(b, 0, len);
                    txt.setText(str2);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
        }
    }
}

打印出来的具体位置如下所示(结合概述所讲内容可以知道这个目录我们可以在映射目录 sdcard 下面找到):

2.5、注意

利用 getExternalFilesDir() 和 getExternalCacheDir() 这两个方法来获取外部存储的私有目录是不需要任何权限的,但是如果用 Environment.getExternalStorageDirectory() 是需要外部存储的读写权限的,而且在 Android 6.0 之后,只在清单文件中声明是不够的,还需要运行时申请,即动态权限。

三、内部存储

3.1、概述

首先,内部存储不是内存。在 Android studio 中,内部存储可以通过 Device File Explorer 找到,文件夹叫做 data,如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访到,且一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。

3.2、获取内部存储位置

我们可以通过 getFileDir() 和 getCacheDir() 这两个方法来获取内部存储的目录,它们位于 data/data/包名/files(cache) 下面,我们同样用外部存储的实例来演示一下,只是把数据存到内部存储中,因为实例效果是完全一样的,就不演示了,直接看代码(具体代码写法上跟外部存储有点不一样):

public class InternalActivity extends AppCompatActivity {

    private EditText edt;
    private TextView txt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_internal);

        edt = findViewById(R.id.editText);
        txt = findViewById(R.id.textView);
    }

    public void operate(View v) {
        File file = new File(getFilesDir(), "getFilesDir.txt");
        switch (v.getId()) {
            case R.id.save_btn:
                try {
                    if (!file.exists()) {
                        file.createNewFile();
                    }
                    FileOutputStream fos = new FileOutputStream(file);
                    fos.write(edt.getText().toString().getBytes());
                    fos.close();
                } catch (Exception e) {

                }
                break;
            case R.id.read_btn:
                try {
                    FileInputStream fis = new FileInputStream(file);
                    byte[] b = new byte[1024];
                    int len = fis.read(b);
                    String str2 = new String(b, 0, len);
                    txt.setText(str2);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
        }
    }
}

四、外部存储与内部存储对比

这里对比的是私有目录,如下表格所示:

外部存储 内部存储
目录获取方式 getExternalFilesDir() getFilesDir()
位置 SDCard/Android/data/包名/files /data/data/包名/files

getExternalCacheDir() 与 getCacheDir() 同理。

五、小结

内部存储与外部存储的知识点我们都已经讲完了,那我们在存储数据的时候应该怎么用呢?一般来说我们不会去用Environment.getExternalStorageDirectory() 这个目录的,因为新的手机基本上都是基于 SDK 29 的,所以,如果我们的内存卡不存在或者被移除的情况下,我们就采用内部存储,如果内存卡存在或者手机自带内存卡的情况下我们就把数据存到外部存储的私有目录下。

最后

小编在这将自己收集的一份《Android核心知识汇总》分享给大家,希望能对大家有所帮助。请点击GitHub获取。 喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗~

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/57522.html

相关文章

口碑动力:企业新闻推广是中小企业品牌建设打造的一个优质 ...

企业新闻对于中大规模企业来说,是形象打造的常规工具,其优势在于软性传播的过程中,能够深入透彻地展示品牌特色以及产品、服务等方面。不过对于中小规模企业,虽然企业新闻推广同样具备了品牌打造的功能,却难以被普遍性认同。口碑动力专业老师分析认为,这和中小规模企业对于品牌的认知认同有...

教你企业网站建设中应注意哪些问题。

教你企业网站建设中应注意哪些问题。

网站建设除了要关注到外观美感呈现之外,还需要关注到其他核心要点,这样为的网站在实用性方面才会更强一些,那么该如何进行相应方案的规划呢?在这其中要关注的要点主要有三个: 网站建设安全很关键 在网站建设过程之中,安全是非常关键的,对于企业用户而言更是如此,它远比其它性能更为重要,这是因为一...

【SEO优化优势】相比其他网络推广方式。

【SEO优化优势】相比其他网络推广方式。

搜索引擎优化工作只不过是搜索引擎优化工作,这很容易说起来困难,但没有优化就不能有排名网站,这是事实。因此,优化搜索引擎优化网站是企业在网站上线后所要做的一项重要的工作。否则,网站就会变成僵尸,对企业来说毫无意义。[交江网站公司]SEO优化是网络营销的一部分,也是网络推广的一种方式。与其他推广方法相比...

如何做到一份完整的营销策划?

如何做到一份完整的营销策划?

出一份完整营销策划书的结构分成两大部分,一是状况分析,二是启用正文第一小点。市场状况分析要了解整个市场规模大小以及敌我对比的情况。市场状况分析必须包含12种,整个产品市场的规模,各地区的销售量与销售额比较分析,各竞争品牌市场占有率比较,偏执比较分析,根据消费者年龄、性别、职...

360搜索品牌直达广告投放推广介绍!

360搜索品牌直达广告投放推广介绍!

360品牌直达广告 360搜索广告投放推广优势介绍! 360搜索文字链广告,投放样式及售卖方式介绍! 360凤舞广告投放推广样式介绍! 360凤舞行业直达广告投放推广产品样式介绍! 360搜索比翼图片广告投放,推广流程及产品优势介绍! 360移动搜索CPC...

网络公司是做什么的呢。

网络公司是做什么的呢。

网络公司一般可以做哪些东西?简单地说就是从事与互联网相关的的工作的公司就是网络公司。一个网络公司不仅仅是要从事注册域名、网站建设、网站优化和网络营销等工作的,还要可以给客户解决关于网络方面的问题。其实现在从事网站建设的公司有很多,每个公司都有着自己不同的业务范围,只是各种业务占的比重不同而已。...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片