文件处理(一)递归构造主类

本文介绍了一个高效文件处理类,通过递归遍历目录,收集并分类存储文件和目录路径,采用私有字段保护和良好判断机制,确保类的完整性和性能优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言:在今后不管是学习还是工作,文件处理是必不可少的,而我倾向于把这一整块打造成一个工具类,便以节省以后学习或工作编程的时间。

关于文件处理,最重要的就是路径了,接下来的我的第一个类就是利用递归遍历下级把所有路径储存在字段中。方便调用,或者作为未来写其他方法类的主类。

该方法类遵从以下几点:

(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]); // 追加到文件路径数组
    }
   }
  }
 }

演示示例:

在这里插入图片描述
在这里插入图片描述

编写java代码实验 2:编写递归下降语法分析器 本实验进行递归下降语法分析器的编程与调试。 3.2.1 实验型 验证型实验 3.2.2 实验目的和要求 通过设计、编制、调试递归下降语法分析程序,实现对词法分析程序所提供的单 词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验,达到以下目 标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的语法分析程序。 3.2.3 背景知识 递归下降分析程序实现思想简单易懂。程序结构和语法产生有直接的对关系。因 为每个过程表示个非终结符号的处理,添加语义加工工作比较方便。 递归下降分析程序的实现思想是:识别程序由组子程序组成。每个子程序对 个非终结符号。 每个子程序的功能是:选择正确的右部,扫描完相的字。在右部中有非终结符号 时,调用该非终结符号对的子程序来完成。 自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推 导出待检查的符号。分析速度慢。而无回溯的自上向下分析技术,当选择某非终结符的 产生时,可根据输入的当前符号以及各产生右部首符号而进行,效率高,且不易出错。 无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。 无左递归:既没有直接左递归,也没有间接左递归。 无回溯:对于任非终结符号 U 的产生右部 x1|x2|…|xn,其对的字的首终结符号 两两不相交。 如果个文法不含回路(形如 P⇒ + P 的推导),也不含以 ε 为右部的产生,那么可 以通过执行消除文法左递归的算法消除文法的切左递归(改写后的文法可能含有以 ε 为 右部的产生)。 文法的左递归消除算法: 1、将文法 G 的所有非终结符排序为 U1 ,U2 ,… ,Un; 2、For(i=1;i++;i≥n) { for j→1 to i-1 把产生 Ui→Ujα 替换成 Ui→β1α| β2α|…|βmα; 其中:Uj→ β1| β2 |… |βm 消除 Ui 产生中的直接左递归; } 3、化简改写之后的文法,删除多余产生17 文法的直接左递归消除公: 直接左递归:U→Ux|y; 其中:x,y∈(VN∪VT)* ,y 不以 U 打头。 直接左递归的消除: U→yU‟ U‟→xU‟|ε 直接左递归般形:U→Ux1|Ux2|…|Uxm|y1|y2|…|yn; 其中:xi≠ε ,yi都不以 U 打头。 般形直接左递归的消除: U→y1U‟| y2U‟ |…| ynU‟ U‟→x1U‟| x2U‟| …| xmU‟|ε 回溯的消除的前提是文法不得含有左递归,可提左因子来消除回溯。 递归下降分析程序的基本架构如下的法: 先定义: 变量:ch:当前符号; 函数:READ(ch):读输入符号; 对于每个非终结符号 U→α 1|α 2|…|α n处理的方法如下: P(U) { if ch∈FIRST(α1 ) then P(α1) //处理 α1 的程序部分。 else if ch∈FIRST(α2 ) then P(α2) //处理 α2 的程序部分。 … else if ch∈FIRST(αn ) then P(αn) else if ch∈FOLLOW(U) then return //处理空产生情况。 else error } 对于每个右部 α =x1x2…xn的处理架构如下: P(α ) { P(x1 ); //处理 x1 的程序。 P(x2 ); //处理 x2 的程序。 … … … P(xn ); //处理 xn的程序。 } 对于右部中的每个符号 xi; 如果 xi为终结符号: if(ch= =a) READ (ch) //对于终结符,直接将指针前调。 else 18 error 如果 xi为非终结符号,直接调用相的过程:p (xi)。 3.2.4 实验内容 1、分析对象 分析算术表达式的 BNF 定义如下: 〈算术表达式〉→〈项〉|〈算术表达式〉+〈项〉|〈算术表达式〉-〈项〉 〈项〉→〈因〉|〈项〉*〈因〉|〈项〉/〈因〉 〈因〉→〈变量〉│(〈算术表达式〉) 〈变量〉→i 用符号表示如下: E→T|E+T|E-T T→F|T*F|T/ F→i│(E) 2、题目: 编写递归下降语法分析器。 3、要求: 根据递归下降法分析法,完成上述算术表达式的分析器构造要完成: (1) 通知外界键入算术表达式(2) 控制过程分析算术表达式(3) 根据分析结果正误,分别通知外界不同的信息。
最新发布
06-07
递归下降分析法 、实验目的: 根据某文法编制调试递归下降分析程序,以便对任意输入的符号进行分析。本次实验的目的要是加深对递归下降分析法的理解。 二、实验说明 1递归下降分析法的功能 词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。 2、递归下降分析法的前提 改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法, 3、递归下降分析法实验设计思想及算法 为G的每个非终结符号U构造递归过程,不妨命名为U。 U的产生的右边指出这个过程的代码结构: (1)若是终结符号,则和向前看符号对照, 若匹配则向前进个符号;否则出错。 (2)若是非终结符号,则调用与此非终结符对的过程。当A的右部有多个产生时,可用选择结构实现。 三、实验要求 ()准备: 1.阅读课本有关章节, 2.考虑好设计方案; 3.设计出模块结构、测试数据,初步编制好程序。 (二)上课上机: 将源代码拷贝到机上调试,发现错误,再修改完善。第二次上机调试通过。 (三)程序要求: 程序输入/输出示例: 对下列文法,用递归下降分析法对任意输入的符号进行分析: (1)E->eBaA (2)A->a|bAcB (3)B->dEd|aC (4)C->e|dc 输出的格如下: (1)递归下降分析程序,编制人:姓名,学号,班级 (2)输入以#结束的符号:在此位置输入符号例如:eadeaa# (3)输出结果:eadeaa#为合法符号 注意: 1.如果遇到错误的表达输出错误提示信息(该信息越详细越好); 2.对学有余力的同学,可以详细的输出推导的过程,即详细列出每步使用的产生。 (四)程序思路 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件输入符号输入到字符缓冲区中。 2.利用递归下降分析法分析,对每个非终结符编写函数,在函数中调用文法开始符号的函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值