Android File相关问题

  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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容