使用这个文件工具类可以方便的对图片资源的存储读取。 还可以很方便的对文件进行遍历,选择你需要的文件。
一.工具类的设计
package com.android.utils.fileUtils;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.os.StatFs;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 本类实现一些File文件的实际功能
* 包括文件的遍历,文件的大小计算
* 这里主要是对存储器的应用
* SD卡的路径:Environment.getExternalStorageDirectory()
* 其中包含的方法有:
* List<File> getAllFile(); //获取手机SD卡根目录下的所有文件对象
* List<File> getAllFile(File dir) //获取手机指定目录下的所有文件对象
* List<File> getAllPicture() //获取手机SD卡的所有图片文件对象
* List<File> getAllPicture(File dir)//获取手机指定目录下的所有图片文件对象
* List<File> getAllFile(File dir,String endWith)//获取手机指定目录下的所有的某个类型文件对象
* List<File> getAllFile(File dir,String[] endWith)//获取手机指定目录下的所有的某个类型文件对象,这里可以传两个或三个元素的集合
* long getSDCardSize() //获取手机SD卡根的空间的大小
* long getSDCardAvailableSize() //获取手机SD卡根的可用的大小
* long getInternalSize() //获取手机内存空间的大小
* long getInternalAvailableSize() //获取手机内存空间的可用空间大小
* <p>
* 最开始的一些操作是文件的保存和读取,后面的才是关于文件的一些操作
*/
public class FileUtils {
/**
* 通过构造方法传入存储的路径
*/
public FileUtils(Context context, String dirName) {
if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
path = Environment.getExternalStorageDirectory().getAbsolutePath() +
"/" + dirName;
}
else {
path = context.getCacheDir().getAbsolutePath() +
"/" + dirName;
}
new File(path).mkdirs();
}
/**
* 文件的写入
* 传入一个文件的名称和一个Bitmap对象
* 最后的结果是保存一个图片
*/
String path;
public void saveBitmapToSDCard(String key, Bitmap bmp) {
FileOutputStream fos =
null;
try {
fos =
new FileOutputStream(
new File(path, key));
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
bmp.compress(Bitmap.CompressFormat.PNG,
100, fos);
try {
fos.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
/**
* 文件的读取,
* 根据文件的名字,读取出一个Bitmap的对象,
* 如果之前没有保存过就有对象值,否则是null
* 这里的文件路径是上面构造器中传入的
*/
public Bitmap
readBitmapFromSDCard(String key) {
return BitmapFactory.decodeFile(
new File(path, key).getAbsolutePath());
}
/**
* 获得根目录下所有的文件的对象
*/
public static final List<File>
getAllFile() {
List<File> files =
new ArrayList<>();
getFileFromDir(Environment.getExternalStorageDirectory(), files);
return files;
}
/**
* 获得指定目录下所有的文件的对象
*/
public static final List<File>
getAllFile(File dir) {
List<File> files =
new ArrayList<>();
getFileFromDir(dir, files);
return files;
}
/**
* 递归遍历文件夹的方法
*/
public static final void getFileFromDir(File dir, List<File> fileList) {
File[] files = dir.listFiles();
if (files ==
null)
return;
for (File file : files) {
if (file.isDirectory())
getFileFromDir(file, fileList);
fileList.add(file);
}
}
/**
* 获得指定目录下的所有的图片
*/
public static final List<File>
getAllPicture(File dir) {
List<File> files = getAllFile(dir);
List<File> imgList =
new ArrayList<>();
for (File file : files) {
if (file.getName().endsWith(
".png") || file.getName().endsWith(
".jpg"))
imgList.add(file);
}
return imgList;
}
/**
* 获得指定目录下的所有的某一个类型的文件
*/
public static final List<File>
getAllFile(File dir, String endWith) {
List<File> files = getAllFile(dir);
List<File> imgList =
new ArrayList<>();
for (File file : files) {
if (file.getName().endsWith(endWith))
imgList.add(file);
}
return imgList;
}
/**
* 获得指定目录下的所有的某一个类型的文件
*/
public static final List<File>
getAllFile(File dir, String[] endWith) {
List<File> files = getAllFile(dir);
List<File> imgList =
new ArrayList<>();
switch (endWith.length) {
case 2:
for (File file : files) {
if (file.getName().endsWith(endWith[
0]) || file.getName().endsWith(endWith[
1]))
imgList.add(file);
}
break;
case 3:
for (File file : files) {
if (file.getName().endsWith(endWith[
0]) || file.getName().endsWith(endWith[
1])
|| file.getName().endsWith(endWith[
2]))
imgList.add(file);
}
break;
}
return imgList;
}
/**
* 获得根目录下的所有图片
*/
public static final List<File>
getAllPicture() {
return getAllPicture(Environment.getExternalStorageDirectory());
}
/**
* 获取SD卡总空间
*/
public static long getSDCardSize() {
StatFs statFs =
new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());
int block = statFs.getBlockSize();
int count = statFs.getBlockCount();
return block * count;
}
/**
* 获取SD卡可用空间
*/
public static long getSDCardAvailableSize() {
StatFs statFs =
new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());
int block = statFs.getBlockSize();
int count = statFs.getAvailableBlocks();
return block * count;
}
/**
* 获取手机内存空间
* 不一定可用?
*/
public static long getInternalSize() {
StatFs statFs =
new StatFs(Environment.getDataDirectory().getAbsolutePath());
int block = statFs.getBlockSize();
int count = statFs.getBlockCount();
return block * count;
}
/**
* 获取手机内存可用的空间
*/
public static long getInternalAvailableSize() {
StatFs statFs =
new StatFs(Environment.getDataDirectory().getAbsolutePath());
int block = statFs.getBlockSize();
int count = statFs.getAvailableBlocks();
return block * count;
}
}
二.显示SD卡下所有图片的示例
package com.example.bitmap;
import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* 显示SD卡下所有的图片的程序示例
*/
public
class ShowImageAll extends Activity {
List<File> list =
new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ListView listView =
new ListView(
this);
list = FileUtils.getAllPicture();
listView.setAdapter(
new MyAdapter(
this, list));
setContentView(listView);
}
/**
* 创建一个handler对象,用于通知图片遍历完后显示出来
*/
/**
* 获取SD卡下的图片对象,耗时操作需要子线程
*/
class MyAdapter extends ListItemAdapter<File> {
MyAdapter(Context context, List list) {
super(context, list);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView =
new ImageView(ShowImageAll.
this);
((ImageView) convertView).setImageURI(Uri.fromFile(list.get(position)));
return convertView;
}
}
}
这里的ListItemAdapter也是自己的一个工具类,继承了BaseAdapter。详细情况: http://blog.csdn.net/wenzhi20102321/article/details/53443060
程序运行后显示的效果图:
这里遍历SD卡没有使用子线程,有时候是会发生问题的,最好是使用子线程来加载数据,加载完成后使用Handler对象类通知视图刷新。
使用这个工具类还能实现图片的三级缓存功能,示例: http://blog.csdn.net/wenzhi20102321/article/details/53214315?locationNum=1&fps=1