Android开发常用的Util方法(文件篇)

如果你要封装工具类,注意使用static关键字
有两点放最前面说明一下:

  • 本文大部分方法都涉及SD卡读写,因此注意在manifest文件里设置相关权限。如果你的目标SDK是23(对应Android 6.0)或更高,还要在Java代码里动态申请权限。相关知识可以戳这里
  • Java的一些文件相关方法是有布尔返回值的(比如createNewFile()返回true代表创建成功,false则代表失败),如果不做处理,编译器会发出警告。多数情况下,不处理并不影响功能运转,而且即使严格要求必须处理,也没有太固定的写法——故本文不给出具体处理的代码,请见谅。

其它有错误或者需要补充的欢迎及时指正~~
相关阅读:Android开发常用的Util方法(屏幕UI篇)

创建一个文件夹

public void createDir(String path) {
    File dir = new File(path);
    if (!dir.exists()) {
        dir.mkdirs();
    }
}

调用:createDir(文件夹路径)
说明:例子里没有返回值,可根据需要灵活设定返回值。后面不再详述

创建一个文件

public void createFile(String path) {
    File file = new File(path);
    if (!file.getParentFile().exists()) {
        file.getParentFile().mkdirs();
    }
    if (!file.exists()) {
        file.createNewFile();
    }
}

调用:createDir(文件完整路径)
说明:需要处理或抛出IOException异常

删除文件或文件夹

public void deleteFile(File file) {
    if (file.isFile()) {
        file.delete();
    } else if (file.isDirectory()) {
        //清空文件夹
        File[] files = file.listFiles();
        int length = files.length;
        int index = 0;
        while (length != 0) {
            deleteFile(files[index]);
            index++;
            length--;
        }
        //删除文件夹
        file.delete();
    }
}

调用:deleteFile(要删除的文件或文件夹)
说明:必须清空文件夹后才能删除之,如果只想清空文件夹,可只封装相关一部分内容。另可考虑重载一个参数是文件路径(String类型)的方法

判断是否有SD卡

public boolean sdcardAvailable() {
    String s = Environment.getExternalStorageState(); 
    return s.equals(Environment.MEDIA_MOUNTED);
}

调用:你懂的……
说明:返回true表示有SD卡,false表示无。友情提醒,我们常说的手机运存相当于电脑内存;手机机身内存又称内置SD卡,相当于电脑硬盘;而这里的SD卡指的是外置SD卡,相当于U盘或移动硬盘。

计算文件或文件夹大小

//首先计算出用数字表示的值
public long getFolderSize(File file) {
    long size = 0;
    File[] files = file.listFiles();
    for (File f : files) {
        size += f.isDirectory() ? getFolderSize(f) : f.length();
    }
    return size;
}
//然后将得到的值格式化
public String getFormatSize (double size) {
    double kB = size / 1024;
    if (kB < 1) {
        return size + "B";
    }
    double mB = kB / 1024;
    if (mB < 1) {
        BigDecimal result1 = new BigDecimal(Double.toString(kB));
        //2表示保留两位小数,ROUND_HALF_UP表示四舍五入
        return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB";
    }
    double gB = mB / 1024;
    if (gB < 1) {
        BigDecimal result2 = new BigDecimal(Double.toString(mB));
        return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB";
    }
    double tB = gB / 1024;
    if (tB < 1) {
        BigDecimal result3 = new BigDecimal(Double.toString(gB));
        return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB";
    }
    BigDecimal result4 = new BigDecimal(tB);
    return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB";
}

调用:getFormatSize(getFolder(文件或文件夹))
说明:这里使用了BigDecimal(大数字精确运算)类,最终返回的格式是诸如"12.34MB"一类的字符串,四舍五入保留两位小数,带单位。可根据实际需要自行调整位数、取舍方式和单位

文件转输入流

public InputStream file2Is(File file) {
    return new FileInputStream(file);
}

调用:file2Is(要转换的文件)
说明:调用完毕记得关流,后面不再详述;另外需要处理或抛出FileNotFoundException异常。附俩方法——

//字符串转输入流
public InputStream String2Is(String s){  
    return new ByteArrayInputStream(s.getBytes());  
}
//输入流转字符串(需要抛出或处理IOException异常)
public String is2String(InputStream is) {
    ByteArrayOutputStream baoS = new ByteArrayOutputStream();
    int i;
    while((i = is.read()) != -1) {
        baoS.write(i);
    }
    return baoS.toString();
}

输入流转文件

public File is2File(InputStream ins, File file) {
    OutputStream os = new FileOutputStream(file);
    int bytesRead;
    //这里设置缓冲区为8K大小,可根据实际情况变更
    byte[] buffer = new byte[8192];
    while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
        os.write(buffer, 0, bytesRead);
    }
    os.close();
    return file;
}

调用:is2File(要转换的输入流, 目标文件)
说明:目标文件一般在方法外预先声明定义。需要处理或抛出IOExceptionFileNotFoundException(它是IOException的子类)异常

Bitmap转文件

public static File bmp2File(Bitmap bmp, File file, Bitmap.CompressFormat format, int quality) {
    FileOutputStream fos = new FileOutputStream(file);
    bmp.compress(format, quality, fos);
    fos.flush();
    fos.close();
    return file;
}

调用:bmp2File(要转换的bmp, 目标文件, 压缩格式, 压缩质量)
说明:参数较多,可根据实际需求重载,主要是压缩格式压缩质量这两个,压缩格式一般是JPEG(也有PNGWEBP可选),压缩质量数字越小压缩度越大(当然质量也越差),一般项目可传7080,传100则代表不压缩。另外此方法需要处理或抛出IOExceptionFileNotFoundException异常。至于文件转Bitmap应该都知道是怎么弄的吧?

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

推荐阅读更多精彩内容