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

作者: 彼岸sakura | 来源:发表于2016-12-05 17:04 被阅读195次

    如果你要封装工具类,注意使用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应该都知道是怎么弄的吧?

    相关文章

      网友评论

        本文标题:Android开发常用的Util方法(文件篇)

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