一 读取文件
在实际开发过程中有各种各样的需求,不知道你们有没有遇到过类似的需求,几个Fragment切换, 数据是读取SD卡中的json文件或者xml文件,那每次点击Fragment就要读取一次文件,虽然java读取文件很快,不过处理不当也需要200ms如果使用String来存储,这里我使用StringBuilder来存储读出来的内容 , 极大的增加了读取速度:
public String readTxtFile(String strFilePath) {
String path = strFilePath;
StringBuilder builder = new StringBuilder();
//打开文件
File file = new File(path);
//如果path是传递过来的参数,可以做一个非目录的判断
if (file.isDirectory()) {
Log.d("TestFile", "The File doesn't not exist.");
} else {
try {
InputStream instream = new FileInputStream(file);
if (instream != null) {
InputStreamReader inputreader = new InputStreamReader(instream);
BufferedReader buffreader = new BufferedReader(inputreader);
String line;
//分行读取
while ((line = buffreader.readLine()) != null) {
builder.append(line + "\n");
}
instream.close();
}
} catch (java.io.FileNotFoundException e) {
Log.d("TestFile", "The File doesn't not exist.");
} catch (IOException e) {
Log.d("TestFile", e.getMessage());
}
}
return builder.toString();
}
二 删除目录以及目录下的文件
大家都知道删除一个文件只需调用 file.delete(); 但是删除文件夹呢, 只需调用下面的方法, 算是递归删除:
/**
* 删除目录(文件夹)以及目录下的文件
* @param sPath 被删除目录的文件路径
* @return 目录删除成功返回true,否则返回false
*/
public boolean deleteDirectory(String sPath) {
//如果sPath不以文件分隔符结尾,自动添加文件分隔符
if (!sPath.endsWith(File.separator)) {
sPath = sPath + File.separator;
}
File dirFile = new File(sPath);
//如果dir对应的文件不存在,或者不是一个目录,则退出
if (!dirFile.exists() || !dirFile.isDirectory()) {
return false;
}
flag = true;
//删除文件夹下的所有文件(包括子目录)
File[] files = dirFile.listFiles();
for (int i = 0; i < files.length; i++) {
//删除子文件
if (files[i].isFile()) {
flag = deleteFile(files[i].getAbsolutePath());
if (!flag) break;
} //删除子目录
else {
flag = deleteDirectory(files[i].getAbsolutePath());
if (!flag) break;
}
}
if (!flag) return false;
//删除当前目录
if (dirFile.delete()) {
return true;
} else {
return false;
}
}
三 读取SD卡指定后缀的所有文件
在实际开发过程中遇到了这样的需求, 做了一个gif的阅览册, 意思就是说要读取sd卡上所有的gif文件, 包括微信,微博等等保存下来的,实际上原理和删除文件差不多, 递归的调用删除, 这里贴上我封装好的方法供大家使用:
/**
* 读取sd卡上指定后缀的所有文件
* @param files 返回的所有文件
* @param filePath 路径(可传入sd卡路径)
* @param suffere 后缀名称 比如 .gif
* @return
*/
public List<File> getSuffixFile(List<File> files, String filePath, String suffere) {
File f = new File(filePath);
if (!f.exists()) {
return null;
}
File[] subFiles = f.listFiles();
for (File subFile : subFiles) {
if(subFile.isFile() && subFile.getName().endsWith(suffere)){
files.add(subFile);
} else if(subFile.isDirectory()){
getSuffixFile(files, subFile.getAbsolutePath(), suffere);
} else{
//非指定目录文件 不做处理
}
}
return files;
}
四 另外附上集合中的排序正序和倒叙方法
其实调用了Collection.sort()的排序方法就已经是正序排序了,那我们这里只说一下倒叙如何来做,Collection.sort(List<T> list, Comparator<? super T> comparator) 方法有2个参数, 第一个为你要排序的List, 第二个可理解为读取出来的俩个对象的比较,下面看下实例源码:
Collections.sort(selectedPositions, new Comparator<String>() {
@Override
public int compare(String lhs, String rhs) {
int l = Integer.parseInt(lhs);
int r = Integer.parseInt(rhs);
//降序
if(l > r){
return -1;
}else if(l < r){
return 1;
}else{
return 0;
}
/* //升序
if(l > r){
return 1;
}else if(l < r){
return -1;
}else {
return 0;
}*/
}
});
这里我要比较的是一个整型的list, compare方法有3个返回值,负整数,0和正整数,我在代码里面加了注释,用的伙伴应该能看懂啦。