Android文件操作(SD卡、缓存)工具类

package com.qf.service_demo05.utils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Environment;
import android.os.StatFs;

public class SDCardHelper {

	// 保存图片的目录

	// private static final String PATH =
	// Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+File.separator;

	/**
	 * @des 判断sd卡是否装载
	 * 
	 * @return true:已经被装载可以使用
	 * */

	public static boolean isSDCardMounted() {
		return Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED);
	}

	/**
	 * @des 获得sdcard的根目录
	 * 
	 * @return sd卡根目录地址
	 * */
	public static String getSDCardBasePath() {
		if (isSDCardMounted()) {
			return Environment.getExternalStorageDirectory().getAbsolutePath();
		} else {
			return null;
		}
	}

	/**
	 * @return 返回sd卡总共的容量
	 * */
	@SuppressLint("NewApi")
	public static long getSDCardTotalSize() {
		long size = 0;
		if (isSDCardMounted()) {
			StatFs statFs = new StatFs(getSDCardBasePath());
			if (Build.VERSION.SDK_INT >= 18) {
				size = statFs.getTotalBytes();
			} else {
				size = statFs.getBlockCount() * statFs.getBlockSize();
			}
			return size / 1024 / 1024;
		}
		return 0;
	}

	/**
	 * @return 返回sd卡可用的容量
	 * */
	@SuppressLint("NewApi")
	public static long getSDCardAvailableSize() {
		long size = 0;
		if (isSDCardMounted()) {
			StatFs statFs = new StatFs(getSDCardBasePath());
			if (Build.VERSION.SDK_INT >= 18) {
				size = statFs.getAvailableBytes();
			} else {
				size = statFs.getAvailableBlocks() * statFs.getBlockSize();
			}
			return size / 1024 / 1024;
		}
		return 0;
	}

	/**
	 * @return 返回sd卡空闲的容量
	 * */
	@SuppressLint("NewApi")
	public static long getSDCardFreeSize() {
		long size = 0;
		if (isSDCardMounted()) {
			StatFs statFs = new StatFs(getSDCardBasePath());
			if (Build.VERSION.SDK_INT >= 18) {
				size = statFs.getFreeBytes();
			} else {
				size = statFs.getFreeBlocks() * statFs.getBlockSize();
			}
			return size / 1024 / 1024;
		}
		return 0;
	}

	/**
	 * @des 存储文件到sd卡的公共目录下
	 * @return true:表示存储成功
	 * 
	 * @param data
	 *            :代表存储的字节数组(任何文件都可以转化成字节数组)
	 * @param type
	 *            :代表sd卡公共目录的路径分类
	 * @param fileName
	 *            :文件的名称
	 * */
	public static boolean saveFileToSDCardPublicDir(byte[] data, String type,
			String fileName) {
		if (isSDCardMounted()) {
			// 获得文件的公共目录
			File file = Environment.getExternalStoragePublicDirectory(type);
			FileOutputStream fos = null;
			BufferedOutputStream bos = null;
			try {
				fos = new FileOutputStream(new File(file, fileName));
				bos = new BufferedOutputStream(fos);
				bos.write(data, 0, data.length);
				bos.flush();
				return true;
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					fos.close();
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return false;
	}

	/**
	 * @des 保存文件到sd卡自定义目录之下
	 * 
	 * @return true -->保存成功
	 * */
	public static boolean saveFileToSDCardCustomDir(byte[] data, String dir,
			String fileName) {
		if (isSDCardMounted()) {
			File file = new File(getSDCardBasePath() + File.separator + dir);
			// 判断这个文件夹是否存在,如果不存在就创建
			if (!file.exists()) {
				file.mkdirs();
			}
			FileOutputStream fos = null;
			BufferedOutputStream bos = null;
			try {
				fos = new FileOutputStream(new File(file, fileName));
				bos = new BufferedOutputStream(fos);
				bos.write(data, 0, data.length);
				bos.flush();
				return true;
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					fos.close();
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return false;
	}

	/**
	 * @des 保存文件到sd卡的私有目录之下
	 * */
	public static boolean saveFileToSDCardPrivateDir(byte[] data, String type,
			String fileName, Context context) {
		if (isSDCardMounted()) {
			BufferedOutputStream bos = null;
			// 获取当前应用程序在sd卡当中的私有目录
			File file = context.getExternalFilesDir(type);
			// 保存路径:/mnt/sdcard/Android/data/<你的包名>/files
			try {
				bos = new BufferedOutputStream(new FileOutputStream(new File(
						file, fileName)));
				bos.write(data, 0, data.length);
				bos.flush();
				return true;
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return false;
	}

	/**
	 * @des 保存文件到sd卡的缓存目录之下
	 * */
	public static boolean saveFileToSDCardCacheDir(byte[] data,
			String fileName, Context context) {
		if (isSDCardMounted()) {
			BufferedOutputStream bos = null;
			// 获取当前应用程序在sd卡当中的私有目录
			File file = context.getExternalCacheDir();
			// 保存路径:/mnt/sdcard/Android/data/<你的包名>/cache/....
			try {
				bos = new BufferedOutputStream(new FileOutputStream(new File(
						file, fileName)));
				bos.write(data, 0, data.length);
				bos.flush();
				return true;
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return false;
	}

	/**
	 * @des 保存图片到sd卡的缓存目录之下
	 * */
	public static boolean saveBitmapToSDCardCacheDir(Bitmap bm,
			String fileName, Context context) {
		if (isSDCardMounted()) {
			BufferedOutputStream bos = null;
			// 获取当前应用程序在sd卡当中的缓存目录
			File file = context.getExternalCacheDir();
			// 保存路径:/mnt/sdcard/Android/data/<你的包名>/cache/....
			try {
				bos = new BufferedOutputStream(new FileOutputStream(new File(
						file, fileName)));

				if (fileName != null
						&& (fileName.contains(".png") || fileName
								.contains(".PNG"))) {
					/**
					 * format:存储图片的格式 quality:比例 stream:写入的流
					 * */
					bm.compress(Bitmap.CompressFormat.PNG, 90, bos);
				} else {
					bm.compress(Bitmap.CompressFormat.JPEG, 90, bos);
				}
				bos.flush();
				return true;
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return false;
	}

	/**
	 * @des 查找指定文件夹中的文件,并且把他读取出来
	 * */
	public static byte[] loadFileFromSDCard(String filePath) {
		BufferedInputStream bis = null;
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		File file = new File(filePath);
		if (file.exists()) {
			try {
				bis = new BufferedInputStream(new FileInputStream(file));
				int len = 0;
				byte[] buffer = new byte[1024 * 8];
				while ((len = bis.read(buffer)) != -1) {
					baos.write(buffer, 0, len);
					baos.flush();
				}
				return baos.toByteArray();
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					bis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return null;
	}
}


getCacheDir()方法用于获取/data/data/<application package>/cache目录
getFilesDir()方法用于获取/data/data/<application package>/files目录
应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的。
大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中。
这样当该应用被卸载后,这些数据还保留在SDCard中,留下了垃圾数据。
如果你想让你的应用被卸载后,与该应用相关的数据也清除掉,该怎么办呢?
通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,
一般放一些长时间保存的数据
通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,
一般存放临时缓存数据
如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,
不会留下垃圾信息。
而且上面二个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项

如果要保存下载的内容,就不要放在以上目录下


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值