FileSizeUtil【获取文件夹或文件的大小】

版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

获取文件夹或者文件的大小,可以指定单位,也可以自动计算合适的单位值。

效果图

 

代码分析

常用的方法:

getFolderOrFileSize(String filePath,int sizeType)【获取指定文件或指定文件夹的的指定单位的大小】

getAutoFolderOrFileSize(String filePath)【自动计算指定文件或指定文件夹的大小】

使用步骤

一、项目组织结构图

注意事项:

1、导入类文件后需要change包名以及重新import R文件路径

2、Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

将FileSizeUtil文件复制到项目中

package com.why.project.filesizeutildemo.utils;

import android.util.Log;

import java.io.File;
import java.io.FileInputStream;
import java.text.DecimalFormat;

/**
 * @CreateBy HaiyuKing
 * @Used android 获取文件夹或文件的大小 以B、KB、MB、GB 为单位
 * @参考资料 http://blog.csdn.net/jiaruihua_blog/article/details/13622939
 */
public class FileSizeUtil {

    public static final int SIZETYPE_B = 1;//获取文件大小单位为B的double值
    public static final int SIZETYPE_KB = 2;//获取文件大小单位为KB的double值
    public static final int SIZETYPE_MB = 3;//获取文件大小单位为MB的double值
    public static final int SIZETYPE_GB = 4;//获取文件大小单位为GB的double值
    /**
     * 获取指定文件或指定文件夹的的指定单位的大小
     * @param filePath 文件路径
     * @param sizeType 获取大小的类型1为B、2为KB、3为MB、4为GB
     * @return double值的大小
     */
    public static double getFolderOrFileSize(String filePath,int sizeType){
        File file=new File(filePath);
        long blockSize=0;
        try {
            if(file.isDirectory()){
                blockSize = getFolderSize(file);
            }else{
                blockSize = getFileSize(file);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("获取文件大小","获取失败!");
        }
        return FormetFileSize(blockSize, sizeType);
    }
    /**
     * 调用此方法自动计算指定文件或指定文件夹的大小
     * @param filePath 文件路径
     * @return 计算好的带B、KB、MB、GB的字符串
     */
    public static String getAutoFolderOrFileSize(String filePath){
        File file=new File(filePath);
        long blockSize=0;
        try {
            if(file.isDirectory()){
                blockSize = getFolderSize(file);
            }else{
                blockSize = getFileSize(file);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("获取文件大小","获取失败!");
        }
        return FormetFileSize(blockSize);
    }
    /**
     * 获取指定文件的大小
     * @param file
     * @return
     * @throws Exception
     */
    private static long getFileSize(File file) throws Exception
    {
        long size = 0;
        if (file.exists()){
            FileInputStream fis = null;
            fis = new FileInputStream(file);
            size = fis.available();
            fis.close();
        }
        else{
            file.createNewFile();
            Log.e("获取文件大小","文件不存在!");
        }
        
        return size;
    }

    /**
     * 获取指定文件夹的大小
     * @param file
     * @return
     * @throws Exception
     */
    private static long getFolderSize(File file) throws Exception
    {
        long size = 0;
        File flist[] = file.listFiles();
        for (int i = 0; i < flist.length; i++){
            if (flist[i].isDirectory()){
                size = size + getFolderSize(flist[i]);
            }
            else{
                size =size + getFileSize(flist[i]);
            }
        }
        return size;
    }
    /**
     * 转换文件大小
     * @param fileSize
     * @return
     */
    private static String FormetFileSize(long fileSize)
    {
        DecimalFormat df = new DecimalFormat("#.00");
        String fileSizeString = "";
        String wrongSize="0B";
        if(fileSize==0){
            return wrongSize;
        }
        if (fileSize < 1024){
            fileSizeString = df.format((double) fileSize) + "B";
        }
        else if (fileSize < 1048576){
            fileSizeString = df.format((double) fileSize / 1024) + "KB";
        }
        else if (fileSize < 1073741824){
            fileSizeString = df.format((double) fileSize / 1048576) + "MB";
        }
        else{
            fileSizeString = df.format((double) fileSize / 1073741824) + "GB";
        }
        return fileSizeString;
    }
    /**
     * 转换文件大小,指定转换的类型
     * @param fileSize
     * @param sizeType 
     * @return
     */
    private static double FormetFileSize(long fileSize,int sizeType)
    {
        DecimalFormat df = new DecimalFormat("#.00");
        double fileSizeLong = 0;
        switch (sizeType) {
        case SIZETYPE_B:
            fileSizeLong=Double.valueOf(df.format((double) fileSize));
            break;
        case SIZETYPE_KB:
            fileSizeLong=Double.valueOf(df.format((double) fileSize / 1024));
            break;
        case SIZETYPE_MB:
            fileSizeLong=Double.valueOf(df.format((double) fileSize / 1048576));
            break;
        case SIZETYPE_GB:
            fileSizeLong=Double.valueOf(df.format((double) fileSize / 1073741824));
            break;
        default:
            break;
        }
        return fileSizeLong;
    }
}
FileSizeUtil

在AndroidManifest.xml中添加权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.why.project.filesizeutildemo">

    <!-- ======================(FileSizeUtil)========================== -->
    <!-- 向SD卡读取数据权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

 添加运行时权限的处理(本demo中采用的是修改targetSDKVersion=22)

三、使用方法

package com.why.project.filesizeutildemo;

import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.why.project.filesizeutildemo.utils.FileSizeUtil;

import java.io.File;

public class MainActivity extends AppCompatActivity {

    private Button btn_getFolderSize;
    private TextView tv_folderSize;
    private Button btn_getFileSize;
    private TextView tv_fileSize;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initViews();
        initEvents();
    }

    private void initViews() {
        btn_getFolderSize = (Button) findViewById(R.id.btn_getFolderSize);
        tv_folderSize = (TextView) findViewById(R.id.tv_folderSize);
        btn_getFileSize = (Button) findViewById(R.id.btn_getFileSize);
        tv_fileSize = (TextView) findViewById(R.id.tv_fileSize);
    }

    private void initEvents() {

        btn_getFolderSize.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String folderPath = Environment.getExternalStorageDirectory().toString() + File.separator + "intentFile";
                Log.w("MainActivity","folderPath="+folderPath);
                String folderSize = FileSizeUtil.getAutoFolderOrFileSize(folderPath);
                tv_folderSize.setText(tv_folderSize.getText() + folderSize);
            }
        });

        btn_getFileSize.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String filePath = Environment.getExternalStorageDirectory().toString() + File.separator + "intentFile" + File.separator + "imgdemo.jpg";
                double fileSizeKB = FileSizeUtil.getFolderOrFileSize(filePath,FileSizeUtil.SIZETYPE_KB);
                String fileSize = FileSizeUtil.getAutoFolderOrFileSize(filePath);
                tv_fileSize.setText(tv_fileSize.getText() + "\n" +
                                        "fileSizeKB=" + fileSizeKB + "\n" +
                                        "fileSize=" + fileSize);
            }
        });
    }
}

混淆配置

参考资料

android 获取文件夹、文件的大小 以B、KB、MB、GB 为单位

项目demo下载地址

https://github.com/haiyuKing/FileSizeUtilDemo

posted @ 2017-07-15 10:02  HaiyuKing  阅读(1722)  评论(0编辑  收藏  举报