计算文件大小超方便的工具类(android.text.format.Formatter)

本文介绍了一个用于自动转换文件大小单位的工具类,该工具能够根据文件的大小自动将其转换为B、KB、MB、GB等更易读的单位,并提供了源代码及使用示例。

根据文件大小自动转为以B,KB, MB, GB为单位的工具类.以后不用自己手动计算。
贴一下源代码,看了之后,让你感觉倍爽:

		public static String formatFileSize(Context context, long number)
		{
	        return formatFileSize(context, number, false);
	    }

		public static String formatShortFileSize(Context context, long number)
		{
	        return formatFileSize(context, number, true);
	    }

		private static String formatFileSize(Context context, long number, boolean shorter) 
		{
	        if (context == null) {
	            return "";
	        }

	        float result = number;
	        int suffix = com.android.internal.R.string.byteShort;
	        if (result > 900) {
	            suffix = com.android.internal.R.string.kilobyteShort;
	            result = result / 1024;
	        }
	        if (result > 900) {
	            suffix = com.android.internal.R.string.megabyteShort;
	            result = result / 1024;
	        }
	        if (result > 900) {
	            suffix = com.android.internal.R.string.gigabyteShort;
	            result = result / 1024;
	        }
	        if (result > 900) {
	            suffix = com.android.internal.R.string.terabyteShort;
	            result = result / 1024;
	        }
	        if (result > 900) {
	            suffix = com.android.internal.R.string.petabyteShort;
	            result = result / 1024;
	        }
	        String value;
	        if (result < 1) {
	            value = String.format("%.2f", result);
	        } else if (result < 10) {
	            if (shorter) {
	                value = String.format("%.1f", result);
	            } else {
	                value = String.format("%.2f", result);
	            }
	        } else if (result < 100) {
	            if (shorter) {
	                value = String.format("%.0f", result);
	            } else {
	                value = String.format("%.2f", result);
	            }
	        } else {
	            value = String.format("%.0f", result);
	        }
	        return context.getResources().
	            getString(com.android.internal.R.string.fileSizeSuffix,
	                      value, context.getString(suffix));
	    }

自己试试一下,看看效果。在子线程里面操作

	 new Thread() {
			public void run() {
				int i = 102;
				do {
				Log.e("tag", Formatter.formatFileSize(MainActivity.this, i));
				Log.e("tag","short---"+ Formatter.formatShortFileSize(MainActivity.this, i));
					i *= 1021;
				} while (i > 0 && i < 1187708226);
			};

		}.start();

打印的结果如下:
这里写图片描述
以后计算文件大小就用它了!
当然自己实现方式也有:

    /**
     * 将byte转换为更加友好的单位
     * @param sizeInB byte
     * @return 更加友好的单位(KB、GB等)
     */
    public static String readableStorageSize(long sizeInB)  {
        float floatSize = sizeInB;
        int index = 0;
        String[] units = new String[]{"B", "KB", "MB", "GB", "TB", "PB"};

        while (floatSize > 1000 && index < 5) {
            index++;
            floatSize /= 1024;
        }

        String capacityText =  new DecimalFormat("###,###,###.##").format(floatSize);
        return String.format(Locale.ENGLISH, "%s%s", capacityText, units[index]);
    }
anr问题trace如下: "main" prio=5 tid=1 Blocked | group="main" sCount=1 ucsCount=0 flags=1 obj=0x72df6468 self=0xb400007072878c00 | sysTid=3104 nice=-2 cgrp=ssfg sched=0/0 handle=0x71230e9d28 | state=S schedstat=( 273294290029 918944300434 897810 ) utm=18065 stm=9263 core=5 HZ=100 | stack=0x7fe106e000-0x7fe1070000 stackSize=8188KB | held mutexes= at com.android.server.alarm.AlarmManagerService$DeliveryTracker.onSendFinished(AlarmManagerService.java:5798) - waiting to lock <0x09677b19> (a java.lang.Object) held by thread 281 at android.app.PendingIntent$FinishedDispatcher.run(PendingIntent.java:382) at android.os.Handler.handleCallback(Handler.java:973) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loopOnce(Looper.java:282) at android.os.Looper.loop(Looper.java:387) at com.android.server.SystemServer.run(SystemServer.java:1069) at com.android.server.SystemServer.main(SystemServer.java:677) at java.lang.reflect.Method.invoke(Native method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:983) DumpLatencyMs: 212.411 "binder:3104_E" prio=5 tid=281 Runnable | group="main" sCount=0 ucsCount=0 flags=0 obj=0x1770d568 self=0xb400006e2db00800 | sysTid=4606 nice=-2 cgrp=ssfg sched=1073741824/0 handle=0x6e0b1ab730 | state=R schedstat=( 113789554601 690500424244 405734 ) utm=6620 stm=4758 core=5 HZ=100 | stack=0x6e0b0b4000-0x6e0b0b6000 stackSize=989KB | held mutexes= "mutator lock"(shared held) at android.icu.util.Currency.getAvailableCurrencyCodes(Currency.java:200) at libcore.icu.ICU.getCurrencyCode(ICU.java:671) at java.util.Currency.getInstance(Currency.java:421) at java.text.DecimalFormatSymbols.initializeCurrency(DecimalFormatSymbols.java:933) at java.text.DecimalFormatSymbols.setCurrency(DecimalFormatSymbols.java:508) at java.text.DecimalFormatSymbols.fromIcuInstance(DecimalFormatSymbols.java:1085) at java.text.DecimalFormat.getDecimalFormatSymbols(DecimalFormat.java:2819) at java.text.SimpleDateFormat.zeroPaddingNumber(SimpleDateFormat.java:1678) at java.text.SimpleDateFormat.subFormat(SimpleDateFormat.java:1593) at java.text.SimpleDateFormat.format(SimpleDateFormat.java:1117) at java.text.SimpleDateFormat.format(SimpleDateFormat.java:1087) at java.text.DateFormat.format(DateFormat.java:333) at java.text.Format.format(Format.java:159) at com.android.server.alarm.AlarmManagerService.setImplLocked(AlarmManagerService.java:2473) at com.android.server.alarm.AlarmManagerService.setImpl(AlarmManagerService.java:2425) - locked <0x09677b19> (a java.lang.Object) at com.android.server.alarm.AlarmManagerService$4.set(AlarmManagerService.java:3103) at android.app.IAlarmManager$Stub.onTransact(IAlarmManager.java:198) at android.os.Binder.execTransactInternal(Binder.java:1523) at android.os.Binder.execTransact(Binder.java:1457) DumpLatencyMs: 84.4358这最后分析是什么结果呢
最新发布
08-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值