Android File相关问题

作者: 努力学习的安同学 | 来源:发表于2018-05-28 17:57 被阅读0次
    1. 18-05-28: 第一遍自己刚写完,未整体修改整理,

    1. 前言

    • 在开发Android中,避免不了和文件打交道,本文记录关于文件操作,文件数据储存的方式,该方式为最简单的文件储存方式,只是将JavaSE中的IO流应用于Android中。

    2. 权限

    1. 首先确保应用是否具有内存卡的读写权限,设置了targetSdkVersion23或者以上默认是禁止的,需要动态申请
    2. 对于Android 5.0及以前的手机,我们需要在manifest中添加
    // SDCard中创建与删除文件权限:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    // SDCard写入数据权限
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    
    1. 对于Android 6.0之后的系统需要动态申请权限,在创建文件之前添加
    ActivityCompat.requestPermissions(this, 
                                      new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
                                      10001); 
    

    然后重写权限回调,获取app的储存权限

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults.length == 0 || PackageManager.PERMISSION_GRANTED != grantResults[0]) {
           Toast.makeText(this,"你拒绝了权限,无法创建!",Toast.LENGTH_LONG).show();
            });
        } else {
            //在这执行你创建文件的代码
        }
    }
    
    1. 判断手机是否拥有外部储存
    /**
      * 获取存储的路径
      *
      * @return 返回存储路径
      */
    public static String getSDPath() {
        // 判断是否挂载
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            return Environment.getExternalStorageDirectory().getAbsolutePath();
        }
        return Environment.getRootDirectory().getAbsolutePath();
    }
    

    3. File的相关使用方法

    1. File(String pathname)
      eg: File file = new File ("/mnt/sdcard/test.txt");
      其中单执行new file并不会创建文件或文件夹,要通过调研mkdirs()函数,这样创建的目录不会删除以前的数据;
      其中要注意的是 mkdir()和mkdirs()的区别,前者不会创建父目录,只能创建一级目录,若没有父目录的话会创建失败,是可以创建多级目录,它是把所有没有的目录都给创建出来。所以开发中常用mkdirs()来创建目录。
    //新建一个File,传入文件夹目录  
    File file = new File("/mnt/sdcard/work/");  
    //判断文件夹是否存在,如果不存在就创建,否则不创建  
    if (!file.exists()) {  
        //通过file的mkdirs()方法创建目录中包含却不存在的文件夹  
        file.mkdirs();  
    }  
    
    1. File(String dir, String subpath)
      eg: File file = new File("/mnt/sdcard/temp", "test.txt");
      看英文文档以为会创建一个txt的文件,然后实际操作中发现时不创建的,可以通过createNewFile()函数这样创建一个空的文件,也可以通过文件流的使用创建
    File file = new File(imagePath, imageName);(当前file对象在手机内部存储不存在)
    if (file.exists())
        file.delete();
    FileOutputStream out = new FileOutputStream(file);
    tBitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);
    
    1. boolean exists():测试文件是否存在
    2. boolean delete(): 删除此对象指定的文件
    3. boolean createNewFile(): 创建新的空文件
    //新建一个File类型的成员变量,传入文件名路径。  
    mFile = new File("/mnt/sdcard/zhiyuan.txt");  
    //判断文件是否存在,存在就删除  
    if (mFile.exists()){  
           mFile.delete();  
    }  
    try {  
          //创建文件  
          mFile.createNewFile(); 
          Toast.makeText(getApplicationContext(), "文件创建成功", Toast.LENGTH_SHORT).show();  
    } catch (IOException e) {  
          e.printStackTrace();  
    }  
    
    1. boolean isDirectory(): 测试此File对象表示的文件是否是目录
    2. boolean mkdir(): 创建由该File对象表示的目录
    3. boolean mkdirs(): 创建包括父目录的目录
    4. String getAbsolutePath(): 返回此对象表示的文件的绝对路径名
    5. String getName(): 返回此对象表示的文件的名称
    6. String getParent(): 返回此File对象的路径名的上一级,若路径名没有上一级,则返回null

    4. 举个栗子🌰

    • 关于外置SD卡下创建file文件(不创建文件夹,使用已有文件夹目录)
    //先通过Environment(环境)的getExternalStorageState()方法来获取手机环境下的外置存储卡的状态,判断是否为挂载状态。  
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {  
        //如果为挂载状态,那么就通过Environment的getExternalStorageDirectory()方法来获取  
          外置存储卡的目录,然后加上我们自己要创建的文件名(记住文件名前要加一个"/"),这样  
          就生成了我们要创建的文件路径。  
        String path = Environment.getExternalStorageDirectory() + "/zhiyuan.txt";  
        //新建一个File对象,把我们要建的文件路径传进去。  
        File file = new File(path);  
        //方便查看,在控制台打印一下我们的存储卡目录。  
        Log.d("=====TAG=====", "onClick: "+Environment.getExternalStorageDirectory());  
        //判断文件是否存在,如果存在就删除。  
        if (file.exists()) {  
            file.delete();  
        }  
        try {  
            //通过文件的对象file的createNewFile()方法来创建文件  
            file.createNewFile();  
            //新建一个FileOutputStream(),把文件的路径传进去  
            FileOutputStream fileOutputStream = new FileOutputStream(path);  
            //给定一个字符串,将其转换成字节数组  
            byte[] bytes = "你好啊,今天天气不错!".getBytes();  
            //通过输出流对象写入字节数组  
            fileOutputStream.write(bytes);  
            //关流  
            fileOutputStream.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
      
    }  
    

    参考文献:

    https://blog.csdn.net/lixiang_Y/article/details/54946199?locationNum=2&fps=1
    https://blog.csdn.net/u013008419/article/details/47312707
    https://blog.csdn.net/codefarmercxy/article/details/54982162

    相关文章

      网友评论

        本文标题:Android File相关问题

        本文链接:https://www.haomeiwen.com/subject/sqagjftx.html