Android之文件管理

文件管理

使用内部存储器

你可以直接保存文件在设备的内部存储。默认情况下,文件保存在你的应用程序的内部存储,其他应用程序或用户不能汸问 。当用户卸载你的应用程序中,这些文件被刪除。

(一)在内部存储创建并写入私有文件:

1,调用〇penFileOutput(name,model)方法,返回一个FileOutputStream,name参数用于指定文件名称,不能包含路径分隔符 “/”,如果文件不存在,会自动创建它。创建的文件保存在/data/data//files/目录中,model参数指的是 使用模式,分别有:
MODE_PRIVATE:私有(创建此文件的应用能够使用,其他应用不能汸问),写入文件会覆盖原来的内容
MODE_PPEMD:私有,在原有内容上增加数椐

MODE_WORLD_RMDABLE,MODE_WORLD_WRITEABLE :可以被其他应用读取或写API17版本中已废弃)不建议使用
2、 调用write方法把数椐写入文件
3、 调用close方法关闭流

(二)读取内部存储的私有文件:

1、 调用 openFilelnput(name)方法,返回一个FilelnputStream,name指的是文件名
2、 调用read方法读取文件字节
3、 调用close方法关闭流

如果想要问res/raw/目录下的原生文件,可以通过openRawResource(),传入R.raw.资料ID,就可以返回一个 InputStream,该文件为只读文件,不能对其执行写入操作。


    /**
     * 写入私有文件
     *
     * @param view
     */
    public void writePrivateFileClick(View view) {
        try {


            FileOutputStream out = openFileOutput("lulu.txt", Context.MODE_PRIVATE);
            String info = "钓鱼岛是中国的!!!";
            byte[] bytes = info.getBytes();
            //写入
            out.write(bytes, 0, bytes.length);
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 读取私有文件
     *
     * @param view
     */
    public void readPrivateFileClick(View view) {
        try {
            InputStream in = openFileInput("lulu.txt");
            byte[] bytes = new byte[1024];
            int len = -1;

            StringBuffer stringBuffer = new StringBuffer();
            while ((len = in.read(bytes)) != -1) {
                stringBuffer.append(new String(bytes, 0, len));
            }

            in.close();
            Toast.makeText(MainActivity.this, stringBuffer.toString(), Toast.LENGTH_SHORT).show();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 读取原生RAW文件
     * @param view
     */
    public void readRAWFileClick(View view) {
        try {
            InputStream in = getResources().openRawResource(R.raw.lulu);


            byte[] bytes = new byte[1024];
            int len = -1;

            StringBuffer stringBuffer = new StringBuffer();
            while ((len = in.read(bytes)) != -1) {
                stringBuffer.append(new String(bytes, 0, len));
            }

            in.close();
            Toast.makeText(MainActivity.this, stringBuffer.toString(), Toast.LENGTH_SHORT).show();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

(三)保存内部缓存文件

如果你想缓存一些数椐,而不是永久保存,可以使用getCacheeDir()打幵文件所在的目录,代表内部应用程序应保存临时缓存 文件。
当设备的内部存储空间低,Android可以刪除这些缓存文件以回收空间。然而,你不应该依赖系统来为你清除这些文件。你应该自己维护缓存文件,并保持在一个合理的消耗空间的限制,如1MB。当用户卸载你的应用程序,这些文件被刪除。
通过getCacheeDir()获取的目录为:/data/data/< package name> /cache

实例代码如下

      //写入一个缓存文件
        public void writePrivateCacheClick(View view) {
            //创建一个缓存的临时文件
            try {
    //            File.createTempFile(前缀, 后缀, 文件目录), 创建一个临时文件
    //            File temp = File.createTempFile("temp",null, getCacheDir());


                File temp = new File(getCacheDir() + "/temp.txt");
                System.out.println(temp.toString());
                FileOutputStream out = new FileOutputStream(temp);
                PrintStream ps = new PrintStream(out);
                ps.println("我是编程王!!");
                ps.close();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void readPrivateCacheClick(View view) {
            //获取到文件路径
            try {
                File temp = new File(getCacheDir() + "/temp.txt");
                BufferedInputStream buf = new BufferedInputStream(new FileInputStream(temp));
                int len = -1;
                byte[] bytes = new byte[1024];

                StringBuffer stringBuffer =new StringBuffer();
                while ((len = buf.read(bytes)) != -1) {
                    stringBuffer.append(new String(bytes, 0, len));
                }
                Toast.makeText(MainActivity.this, stringBuffer.toString(), Toast.LENGTH_SHORT).show();

                buf.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

其他有用的方法

  • getFileDir() 获取私有文件目录: /data/data/< package name> /files
  • getDir(name, model) 创建(或打开已存在)目录: /data/data/< package name> /app_文件名
  • deleteFile(name) 删除私有目录的文件: /data/data/< package name> /files
  • filesLIst() 获取/data/data/< package name> /files目录下的文件名数组

使用外部存储器

所欲兼容Android的设备都支持一个可共享的”外部存储(external storage)”, 可用来保存文件. 这可以使一个可移动的存储设备(如SD卡)或者一个内部的(不可移动的)存储. 保存在外部存储的文件是可读的. 并且当用于传输数据的USB大容量存储选项启用时, 用户能够在计算机上修改他们.

(一), 获取外部存储权限

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

既要读也要写权限, 可须添加写权限就好

注意: 在4.4中, 如果外部的文件私有化, 你可以不需要修改这些权限

(二) 检查媒体的可用性

在使用外部存储来保存数据时, 我们应该使用getExternalStorage()来检查当前设备是否存在外部存储设备(SD卡):

(三) 访问sdcard的路径

以前Android4.1 之前的版本中, SDcard路径通过”/sdcard”或者”/mnt/sdcard” 来表示, 而在Jelly Bean系统中修改为了”/storage/sdcard0”, 以后还会有多个SDcard的情况. 目前为了报纸和之前代码的兼容, sdcard路径做了link映射

为了使代码更加的健壮并能兼容以后的Android版本和新设备, 请通过Environment.getExternalStorageDirectory().getPath();获取路径

示例代码:

//判断当前设备的外部存储设备是否可用, 可用的情况下打印SDCard的路径
    public void isSDCardClick(View view){
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            Toast.makeText(MainActivity.this, "存在SD卡", Toast.LENGTH_SHORT).show();
             //判断当前设备是否为只读
            if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)){
                Toast.makeText(MainActivity.this, "并且SD卡为只读", Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(MainActivity.this, Environment.getExternalStorageDirectory().getPath(), Toast.LENGTH_SHORT).show();
            }
        }else{
            Toast.makeText(MainActivity.this, "不存在SD卡", Toast.LENGTH_SHORT).show();
        }
    }

如果想要往sdcard保存特定类型的内容, 可以考虑使用Environment.getExternalStoragePublicDirectory(String type);,该函数可以返回特定类型的目录

(四) 外部存储器保存私有文件 4.4版本(api19) 可用

为了文件的保密性, 你必须保证自己的文件不让其他app读取. 你可以使用getExternalFilesDir(type), type为null表示为默认类型
通过getExternalFilesDir(); 方法获取到SDCard/Android/data/包名/files/目录, 一般放一些长时间保存的数据.

**注意, getExternalFilesDir(). 这个方法不一定总能访问sd卡中的信息..
如果设备自身已经有了一部分内部存储当作外部存储, 那这个方法就访问不到sd卡.**

当用用户卸载应用程序时, Android系统会删除以下内容:

  1. 你保存在内部存储的所有文件
  2. 所有使用本应用外部存储的私有文件

(五) 外部存储保存私有缓存文件

通过getExternalCacheDir(); 方法可以获取到SDCard/Android/data/包名/cache/目录, 一般存放临时缓存数据

卸载时全部清空不会留下垃圾.

示例代码:

//写入SDCard私有文件
    public void writeSDCardPrivateFileClick(View view){

        File file = getExternalFilesDir(null);
        if(file != null){
            try {
                FileOutputStream out = new FileOutputStream(file + "/lulu.txt");

                PrintStream ps = new PrintStream(out);
                ps.print("钓鱼岛是中国的");
                ps.close();
                out.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //写入SDCard私有缓存文件
    public void writeSDCardPrivateCacheFileClick(View view){
        File file = getExternalCacheDir();
        if(file != null){
            try {
                FileOutputStream out  = new FileOutputStream(file + "lulu.txt");

                PrintStream ps = new PrintStream(out);
                ps.print("钓鱼岛就是中国的!!");
                ps.close();
                out.close();


            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

(六) 查询空闲空间

  • getFreeSpace()–返回剩余空间
  • getTotalSpace()–返回总空间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值