开发的时候我们可能会遇到一些需求:遍历删除指定目录下的指定格式的文件。
这里提供一个工具类,其对外暴露三个参数,参数一:要删除的文件目录的路径,参数二:区分是前缀还是后缀,参数三:具体前缀或者后缀字符规则。删除的时候,先枚举出路径目录下的所有文件,枚举的同时实现一个FilenameFilter接口的类,可以自定义规则,比说前缀、后缀或者其他规则,枚举的同时将我们的过滤器作为参数,这样我们就可以匹配到指定条件的文件,然后删除即可。
首先定义 DeleteFileFilter.java
package com.example.testbaiduinputfilesizedemo;
import androidx.annotation.NonNull;
import java.io.File;
import java.io.FilenameFilter;
public class DeleteFileFilter implements FilenameFilter {
private boolean isPrefix;
private String mRegEx;// 前缀或后缀规则
public DeleteFileFilter(boolean isPrefix, @NonNull String regEx) {
this.isPrefix = isPrefix;
this.mRegEx = regEx;
}
@Override
public boolean accept(File file, String s) {
return isPrefix ? s.startsWith(mRegEx) : s.endsWith(mRegEx);
}
}
接下来,定义具体的实现逻辑,因为是对于文件的读写操作,所以逻辑最好是放到 Runnable中,定义 DeleteRunnable.java:
package com.example.testbaiduinputfilesizedemo;
import android.text.TextUtils;
import android.util.Log;
import java.io.File;
public class DeleteRunnable implements Runnable{
private String mRegEx;
private String dirPath;
private boolean isPrefix;
private static final String TAG = DeleteRunnable.class.getSimpleName();
/**
* Constructor
*
* @param dirPath 要删除文件所在的目录路径
* @param isPrefix true为前缀 false为后缀
* @param mRegEx 规则
*/
public DeleteRunnable(String dirPath, boolean isPrefix, String mRegEx) {
this.mRegEx = mRegEx;
this.dirPath = dirPath;
this.isPrefix = isPrefix;
}
@Override
public void run() {
enumAllFileList();
}
/**
* 枚举并删除所有符合条件(前缀)的文件
*/
private void enumAllFileList() {
if (!TextUtils.isEmpty(dirPath)) {
File adDir = new File(dirPath);
if (adDir.exists() && adDir.isDirectory()) {
if (!TextUtils.isEmpty(mRegEx)) {
DeleteFileFilter filter = new DeleteFileFilter(isPrefix, mRegEx);
// 2.匹配是否是需要删除的文件
File[] fileList = adDir.listFiles(filter);
if (fileList != null && fileList.length > 0) {
for (File file : fileList) {
if (file.isFile() && file.exists()) {
boolean delete = file.delete();
Log.i(TAG, "删除符合条件的文件" + (delete ? "成功~" : "失败!"));
}
}
}
}
}
}
}
}
最后最好是放到线程池中,对外使用,定义 DeleteUtil.java :
package com.example.testbaiduinputfilesizedemo;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class DeleteUtil {
private static final ExecutorService executor = Executors.newSingleThreadExecutor();
/**
* 删除指定目录指定前后缀的文件
*
* @param dirPath
* @param isPrefix
* @param regEx
*/
public static void delete(String dirPath, boolean isPrefix, String regEx) {
executor.execute(new DeleteRunnable(dirPath, isPrefix, regEx));
}
}
以上就是完整的工具类,当使用的时候,只需要像下面一样调用即可:
//删除 /sdcard/DCIM/Camera/ 下的文件 DeleteUtil.delete("/sdcard/DCIM/Camera/", false, ".jpg");
其实,根据以上的相关代码,我们还可以实现另一个功能:计算指定目录下指定格式文件总大小。相关代码如下:
private long getAllTargetFileSizes(String dirPath, boolean isPrefix, String mRegEx){
long targetFileSizes= 0L;
if (!TextUtils.isEmpty(dirPath)) {
File adDir = new File(dirPath);
if (adDir.exists() && adDir.isDirectory()) {
if (!TextUtils.isEmpty(mRegEx)) {
FileFilter filter = new FileFilter(isPrefix, mRegEx);
// 匹配是否是需要考虑计算在内的文件
File[] fileList = adDir.listFiles(filter);
if (fileList != null && fileList.length > 0) {
for (File file : fileList) {
if (file.isFile() && file.exists()) {
//计算大小
targetFileSizes += file.length();
Log.i("heguodong", " -->" + targetFileSizes);
}
}
}
}
}
}
Log.i("heguodong", "总的这几个文件的大小是 -->" + targetFileSizes);
return targetFileSizes;
}
class FileFilter implements FilenameFilter {
private boolean isPrefix;
private String mRegEx;// 前缀或后缀规则
public FileFilter(boolean isPrefix, @NonNull String regEx) {
this.isPrefix = isPrefix;
this.mRegEx = regEx;
}
@Override
public boolean accept(File file, String s) {
return isPrefix ? s.startsWith(mRegEx) : s.endsWith(mRegEx);
}
}
在使用的时候,只需要如下:
//计算文件大小 /storage/emulated/0/baidu/tempdata/ /sdcard/baidu/tempdata/
long aaa = getAllTargetFileSizes("/sdcard/baidu/tempdata/",false,".dat");
以上就是全部内容。
参考:
https://www.cnblogs.com/angel88/p/8109763.html
https://blog.youkuaiyun.com/qq_34330286/article/details/79660059