引言:在今后不管是学习还是工作,文件处理是必不可少的,而我倾向于把这一整块打造成一个工具类,便以节省以后学习或工作编程的时间。
关于文件处理,最重要的就是路径了,接下来的我的第一个类就是利用递归遍历下级把所有路径储存在字段中。方便调用,或者作为未来写其他方法类的主类。
该方法类遵从以下几点:
(1) 私有字段保护
在类中的字段不可以被外部更改,以确保类的完整性,需要外部访问的字段开放一个外部获取该字段的方法,方便外部访问。
(2) 良好的判断
在传递一个路径进来之后我们需要先判断这个路径是否纯在并且是一个目录路径。在进行构造该类。
(3) 详细的注释和提示信息
对所有字段以及方法打上注释,方便维护,给定一个字段(类是否构造成功)
(4) 重构该类的方法
假如在某一个地方我需要操作多批文件(目录不一致),我可以直接调用重构方法传递新的目录路径使其重新构造该类,无需重新实例该类,还可以减少不必要的实例,加快性能。
/**
* 文件操作类
*
* @author 织梦
*/
class FileHanding {
/**
* 类构造成功否
*/
private boolean classSuccessfulNo = false;
/**
* 存放目录的路径
*/
private List<String> cataloguePath = new ArrayList<>();
/**
* 存放文件的路径
*/
private List<String> filePath = new ArrayList<>();
/**
* 储存传递进来的文件路径
*/
private String strOldPath;
/**
* 获取类构造成功否
*/
public boolean getClassSuccessfulNo() {
return classSuccessfulNo;
}
/**
* 获取存放目录路径的list
*
* @return List<String>
*/
public List<String> getCataloguePath() {
return cataloguePath;
}
/**
* 获取存放文件路径的list
*
* @return List<String>
*/
public List<String> getFilePath() {
return filePath;
}
/**
* 获取储存传递进来的文件路径
*
* @return String
*/
public String getStrOldPath() {
return strOldPath;
}
思维与逻辑:如何构造类(一):
(1) 传递一个路径构造该类,在构造器中直接调用重构的方法
(2) 初始化字段,储存构造该类的路径
(3) 判断该路径是否符合要求(是一个有效的目录路径),储存标志字段(是否成功构造该类)
(4) 将该路径写入到存放目录的字段中
(5) 传递该路径调用递归方法
/**
* 构造函数,传递一个目录路径
*
* @param strPath
*/
public FileHanding(String strPath) {
reconsitutionFileHanding(strPath);
}
/**
* 重新构造该类,减少不必要的实例
*
* @param strPath
*/
public void reconsitutionFileHanding(String strPath) {
this.cataloguePath.clear(); // 清空list
this.filePath.clear();
this.strOldPath = strPath; // 储存构造该类的 路径
File file = new File(strPath); // 创建File对象
if (file.isDirectory()) { // 判断是否是一个目录
classSuccessfulNo = true; // 标志成功
cataloguePath.add(strPath); // 写入第一个路径(自身)
recurrenceFile(strPath); // 调用递归方法构造
} else {
classSuccessfulNo = false; // 标志失败
}
}
思维与逻辑:如何构造类(二):
(1) 正则替换掉末尾的“/”(F:/Text1与F:/Text1/相同)
(2) 获取下级所有文件和目录的名称赋值给字符串数组
(3) 判断字符串数组是否为空,也就是判断该目录下级是否有文件或目录
(4) 循环遍历字符串数组
(5) 拼接路径(传递过来的目录路径 + / + 下级名称)
(6) 创建File对象,判断该路径是文件还是目录
(7) 追加该路径到对应的字符串数组字段(文件字符串数组字段,目录字符串数组字段)
(8) 如果是目录路径继续调用该递归方法,如此往复直到没有下级目录。
/**
* 递归遍历下级,物理路径存储到对应list
*
* @param strPath
* 物理路径
*/
private void recurrenceFile(String strPath) {
strPath = strPath.replaceAll("\\/+$", ""); // 正则替换掉最后的"/"
File file = new File(strPath); // 创建File
String[] strings = file.list(); // 获取子级所有文件和目录的名称
if (strings != null) { // 若有下级则循环遍历
for (int i = 0; i < strings.length; i++) {
File fileSon = new File(strPath + "/" + strings[i]);
if (fileSon.isDirectory()) {
cataloguePath.add(strPath + "/" + strings[i]); // 追加到目录路径数组
recurrenceFile(strPath + "/" + strings[i]); // 继续递归
} else {
filePath.add(strPath + "/" + strings[i]); // 追加到文件路径数组
}
}
}
}
演示示例: