使用这个文件工具类可以方便的对图片资源的存储读取。
还可以很方便的对文件进行遍历,选择你需要的文件。
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 getAllFile(); //获取手机SD卡根目录下的所有文件对象
* List getAllFile(File dir) //获取手机指定目录下的所有文件对象
* List getAllPicture() //获取手机SD卡的所有图片文件对象
* List getAllPicture(File dir)//获取手机指定目录下的所有图片文件对象
* List getAllFile(File dir,String endWith)//获取手机指定目录下的所有的某个类型文件对象
* List getAllFile(File dir,String[] endWith)//获取手机指定目录下的所有的某个类型文件对象,这里可以传两个或三个元素的集合
* long getSDCardSize() //获取手机SD卡根的空间的大小
* long getSDCardAvailableSize() //获取手机SD卡根的可用的大小
* long getInternalSize() //获取手机内存空间的大小
* long getInternalAvailableSize() //获取手机内存空间的可用空间大小
*
* 最开始的一些操作是文件的保存和读取,后面的才是关于文件的一些操作
*/
public class FileUtils {
/**
* 通过构造方法传入存储的路径
*/
public FileUtils(Context context, String dirName) {
//判断是否本地有sd卡,这里代表的是SD卡在就绪的状态
if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + dirName;
} else {
//保存在内部存储器中
path = context.getCacheDir().getAbsolutePath() + "/" + dirName;
}
//创建文件
new File(path).mkdirs();
}
//判断是否本地有sd卡,确定是否保存在SD卡内
/**
* 文件的写入
* 传入一个文件的名称和一个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 getAllFile() {
List files = new ArrayList<>();
getFileFromDir(Environment.getExternalStorageDirectory(), files);
return files;
}
/**
* 获得指定目录下所有的文件的对象
*/
public static final List getAllFile(File dir) {
List files = new ArrayList<>();
getFileFromDir(dir, files);
return files;
}
/**
* 递归遍历文件夹的方法
*/
public static final void getFileFromDir(File dir, List 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 getAllPicture(File dir) {
List files = getAllFile(dir);
List 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 getAllFile(File dir, String endWith) {
List files = getAllFile(dir);
List imgList = new ArrayList<>();
for (File file : files) {
if (file.getName().endsWith(endWith))
imgList.add(file);
}
return imgList;
}
/**
* 获得指定目录下的所有的某一个类型的文件
*/
public static final List getAllFile(File dir, String[] endWith) {
List files = getAllFile(dir);
List 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 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;
}
}
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 list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//创建一个ListView显示图片
ListView listView = new ListView(this);
//获取SD卡内的图片
list = FileUtils.getAllPicture();
//给ListView添加Adapter对象
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