android五种存储方式总结之二(文件存储)

在了解文件存储之前首先要了解一下内存,内部存储,外部存储的概念,以及清楚缓存与清除数据 清楚的是什么,详细请看 https://blog.csdn.net/u010937230/article/details/73303034

1 . 内存:我们在英文中称作memory,内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,所以说它是用于计算机运行时的,它不是用来存储数据的。

2 . 内部存储,外部存储:内部存储我们称为InternalStorage,外部我们称为ExternalStorage。一般情况,由于内部存储空间少,我们都把数据存储在外部存储中。主要分为两种情况:
一是Android4.4之前,内置存储就是内部存储,外置SD卡就是外置存储。
二是Android4.4之后,手机机身存储空间变大,这时外部存储就包含两部分了,机身存储的外部存储和外置SD卡。

3 . 清除缓存:应用程序在运行过程中需要经过很多过程,比如读入程序,计算,输入输出等等,这些过程中肯定会产生很多的数据,它们在内存中,以供程序运行时调用。所以清除缓存清除的是APP运行过程中所产生的临时数据。

4 . 清除数据:清除数据才是真正的删除了我们保存在文件中的数据(永久性数据,如果不人为删除的话会一直保存在文件中)例如当我们在设置里面清除了某个应用的数据,那么/data/user/0/packname/和/storage/emulated/0/Android/data/packname/下的文件里面的数据会全部删除,包括cache,files,lib,shared_prefs等等。

5 . 打印对比
–> Environment.getDataDirectory() = (/data)获取内部存储的根路径
–> getFilesDir().getAbsolutePath() = (/data/user/0/packname/files )获取某个应用在内部存储中的files路径
–> getCacheDir().getAbsolutePath() =(/data/user/0/packname/cache )获取某个应用在内部存储中的cache路径
–> getDir(“myFile”, MODE_PRIVATE).getAbsolutePath() =( /data/user/0/packname/app_myFile )获取某个应用在内部存储中的自定义路径

–> Environment.getExternalStorageDirectory().getAbsolutePath() = (/storage/emulated/0 )获取外部存储的根路径
–> Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath() = (/storage/emulated/0 )获取外部存储的根路径
–> getExternalFilesDir(“”).getAbsolutePath() = (/storage/emulated/0/Android/data/packname/files)获取某个应用在外部存储中的files路径 ,4.4以前的系统中返回为null
–> getExternalCacheDir().getAbsolutePath() = (/storage/emulated/0/Android/data/packname/cache)获取某个应用在外部存储中的cache路径 ,4.4以前的系统中返回为null

–> Environment.getDownloadCacheDirectory() = (/cache)每个版本的android系统都一样
–> Environment.getRootDirectory() = (/system)每个版本的android系统都一样
6 . 优点:文件可用来存放大量数据,如文本、图片、音频等

一 . 内部存储 读取数据:

描述:content提供了openFileInput(String name),openFileOutput(String name , int mode)两个方法可以直接打开文件IO流,其中name为文件名,mode为打开模式,分为以下几种:

–> MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。
–> MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
–> MODE_WORLD_READABLE:表示当前文件可以被其他应用读取。
–> MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
–> MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用读取和写入。

默认路径:data/data/主包名/files
写入

private void writeInside(String name, String content){
    try {
        FileOutputStream outStream=this.openFileOutput(name, Context.MODE_PRIVATE);
        outStream.write(content.getBytes());
        outStream.close();
    } catch (FileNotFoundException e) {
        return;
    } catch (IOException e){
        return ;
    }
}

读取:

private String readInside(String name){
    try {
        FileInputStream inStream=this.openFileInput(name);//name=hello.txt
        ByteArrayOutputStream stream=new ByteArrayOutputStream();
        byte[] buffer=new byte[1024];
        int length=-1;
        while((length=inStream.read(buffer))!=-1)   {
            stream.write(buffer,0,length);
        }
        stream.close();
        inStream.close();
        return new stream.toString();
    } catch (FileNotFoundException e) {
        return null;
    } catch (IOException e){
        return null;
    }
}
二 . 外部存储 读取数据:

在AndroidManifest.XML中添加权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

判断是否存在:

private boolean judgeOutsude() {
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
        return true
    } else {
        return false;
    }
}

写入:

    private void writeOutside(String name, String content){
        try {
            File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录
            File saveFile = new File(sdCardDir, name);
            FileOutputStream outStream = null;
            outStream = new FileOutputStream(saveFile);
            outStream.write(content.getBytes());
            outStream.close();
        } catch (FileNotFoundException e) {
            return;
        } catch (IOException e) {
            return;
        }
    }

读取:

    private String readOutside(String name){
        try {
            // 创建文件
            File file = new File(Environment.getExternalStorageDirectory(), name);
            if (file.exists()){
                // 创建FileInputStream对象
                FileInputStream fis = new FileInputStream(file);
                // 创建字节数组 每次缓冲1M
                byte[] b = new byte[1024];
                int len = 0;// 一次读取1024字节大小,没有数据后返回-1.
                // 创建ByteArrayOutputStream对象
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                // 一次读取1024个字节,然后往字符输出流中写读取的字节数
                while ((len = fis.read(b)) != -1) {
                    baos.write(b, 0, len);
                }
                // 将读取的字节总数生成字节数组
                byte[] data = baos.toByteArray();
                // 关闭字节输出流
                baos.close();
                // 关闭文件输入流
                fis.close();
                // 返回字符串对象
                return new String(data);
            }else {
                return null;
            }
        } catch (Exception e) {
            return null;
        }
    }
三 . Assets资源文件:该文件是编译时存放的资源文件,只能读取,不能修改或删除。

(1) 读取图片

private void readAssetsImage(){
        try {
            //图片
            InputStream inputStream = this.getAssets().open("wait.png");
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            inputStream.close();
            inputStream = null;
            save_file_iv_assets.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

(2) 读取文字

private void clickAssets(){
        try {
            //图片
            InputStream inputStream = this.getAssets().open("wait.png");
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            inputStream.close();
            inputStream = null;
            save_file_iv_assets.setImageBitmap(bitmap);
            //txt文件
            inputStream = this.getAssets().open("hello.txt");
            int size = inputStream.available();
            byte[] buffer = new byte[size];
            inputStream.read(buffer);
            inputStream.close();
            String text = new String(buffer, "utf-8");
            save_file_txt_content.setText(text);
            //
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

刚开始写文章,有什么毛病请大家提出来,便于我及时改正,谢谢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值