编写背景
大二上学期期末的时候堆了一堆实验报告要交,数据结构2个实验,java4个实验,还有线代截图要收,每次收作业即使通知同学们按规定命名文件但还有很多同学不按规定命名五花八门啥都有,每次收作业都要收个1 个多小时才能收齐,期末都没得时间复习了😭😭😭😭
然后刚好那个学期学了java,对java还比较感兴趣和熟悉,刚一考完试我就开始动手了,边学边写花了我5个小时。整个代码的实现逻辑都是自己想的,然后剩下一下没学过的类和方法在网上学习。之前用python写过一个差不多的十几行的代码实现“微信群接龙”查找名字,这个程序也是借鉴了上次的思想。
这是V1.0版本的,功能只有查找没交作业名单的功能,本来第二次更新V2.0的时候加入了自动重命名功能的,但是我今天在打开NetBeans的时候之前写代码都不见了55555,Github上也找不到(我记得当时备份了yue),现在这个代码还是我翻聊天记录找的,之前复制给别的班学委留下来的记录(还好当时发给别人过)。不然真的惨死了,真的一点都想不起来之前怎么写的了。
V2.0版本虽然新增了自动重命名功能,但是我当时并没有把学号加进去,当时是有思路的,但嫌麻烦是懒得弄了,看需要吧,如果我或者大家需要自动重命名功能的话我到时会在重新写一个完整的。
V3.0版本我当时是想做一个GUI然后打包的,方便大家使用,本来是想在暑假做的,后来暑假。。。(懂得都懂)结果现在关于GUI的知识也都已经忘完了,随缘🙏。如果哪天心血来潮的话再上线吧。
话不多说,开干!
——2021.4.1更新:已经在github上找到V2.0版本的代码了,一下文章是V2.0的文档。代码版本管理真的太重要了,之前的git操作都忘了差不多了,看来得重新再看看git原理了✊,顺便吐槽一下github打开真的太慢了,每次打开都好久好久都毛火完了,是不是该考虑转gitee了,有没有用过gitee的伙伴分享一下体验🙏🙏
使用前的准备工作
- Java开发环境,我们老师推荐我们用的是NetBeans,当然其他的也可以
- 一个存放了班级所有名字的.txt文件,注意格式每一行放一个人名
- 如果使用重命名功能,千万千万记得备份一份,万一重命名出现了BUG名字就乱套了
- 重命名功能可能不太稳定注意备份测试后使用
代码原理
一共两个类:
- Check类:是主类,包含核心查找方法以及人名的读取
- FileNames类:主要包含关于文件操作的属性和方法
核心查找方法的原理:
第一步:创建全体名单数组(allName[])
用一个.txt文件按行存放每个同学的名字(可以从班级名字表中复制),再按行读取每个名字存到一个字符串数组(allName[])里,这样就能确保每个名字独占一个数组空间。
第二步:创建包含所有文件名的字符串型变量(txt)
把下载的同学们的作业文件名也分别存到一个字符串型数组(name[])里,再把每个文件名取出来集中放到一个字符串变量(txt)中。
第三步:在txt中查找allName中的每一个元素
使用java String 类中的contain方法即可实现。
重命名方法原理:
等待更新……
源代码展示
Check类:(又重新添加了很多注释,应该不难看懂)
package check;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
/**
*
* @author Yuukyou
*/
//check类
public class Check {
String[] allName= new String[50]; //数组allNme用于存放完整的班级名单,默认长度为50,可根据具体人数修改
String txt = ""; //初始化txt变量
/***该方法用于全体人名的读取和写入***/
public void printByFileReader(String filePath) throws IOException
{
File file = new File("E:\\全体名单.txt"); //打开存放有全体名单的txt文本文件,每一行存放一个人名
FileReader fileReader = new FileReader(file);
LineNumberReader reader = new LineNumberReader(fileReader); //创建reader对象用于读取每一行的人名
String txt = "";
for(int lines=1;lines<=35;lines++){ //lines:行数,即读取人名数量,根据具体人数改变
txt = reader.readLine(); //txt记录每一次读取到的人名
allName[lines]=txt; //将每次txt中的人名存放到allName数组
// System.out.println("第"+lines+"行的内容是"+allName[lines]); //此行用于测试是否存放成功
}
reader.close();
fileReader.close();
}
/***check方法用于检测没交作业的同学***/
public void check(String[] all,String txt){ //txt存放所有文件名
for(int i=1;i<=35;i++){
boolean status =txt.contains(all[i]); //每次取全体名单中的一个元素,在txt中查找
if(!status) {
System.out.println(all[i]+"未交作业");} //若不存在则输出未交作业名单
}
}
public static void main(String[] args) throws IOException {
// TODO code application logic here
FileNames Newname = new FileNames();
Newname.FileName("E:\\电商1903作业\\电商1903java实验报告\\实验一");
Check Allname = new Check();
Allname.printByFileReader("E:\\全体名单.txt");
Allname.check(Allname.allName,Newname.FileName("E:\\电商1903作业\\电商1903java实验报告\\实验一"));
}
}
FileNames类:(一些被注释掉的代码块是当时写代码时候的其他版本,没注释的是慢慢调式过来能用的版本,大家也可以自己把注释的代码块删了)
package check;
import java.io.File;
import java.io.IOException;
/**
*
* @author Yuukyou
*/
public class FileNames {
static String partaddress = "E:\\电商1903作业\\电商1903java实验报告\\实验二";
static String alladdress = "E:\\全体名单.txt";
static String partName = ""; //调用txt前先使用FileName方法
public FileNames() {
}
public static String FileName(String filePath){
File file =new File(filePath); //传入
String[] name = file.list(); //String[] list() : 返回一个字符串数组,这些字符串指定file路径下的所有文件和目录 ==》列出文件名
String txt="";
for(int i=1;i<name.length;i++){ //将所有文件名从数组name中取出,放到txt变量中
txt+=name[i];
}
// 测试 System.out.println(txt);
return txt;
}
public static String GetFileName(String filePath) {
File file = new File(filePath);
String[] name = file.list();
//String txt="";
for (int i = 0; i < name.length; i++) {
partName += name[i];
}
//System.out.println(partName);
return partName;
}
public static void Rename(String filePath) throws IOException {
File file = new File(filePath);
String[] filename = new String[50];
// file.renameTo(new File(filePath));
//读取文件夹下的文件,存进一个文件数组
File[] listfile = file.listFiles();
//读取每个文件名称,找下标对应
String[] name = file.list();
// for(int l=0;l<name.length;l++){
// System.out.println(name[l]);}
int k= 0;
for (k=0; k < name.length; k++) {
filename[k] += name[k];
System.out.println("第"+k+"个文件名"+filename[k]);
}
// File file = new File(partaddress);
/* FileReader fileReader = new FileReader(file);
LineNumberReader reader = new LineNumberReader(fileReader);
String txt = "";
for(int lines=0;lines<=35;lines++){
txt = reader.readLine();
filename[lines]=txt;
System.out.println("第"+lines+"行的内容是"+filename[lines]);
}*/
//遍历重命名
Check check = new Check();
check.printByFileReader(alladdress);
Check Allname = new Check();
Allname.printByFileReader(alladdress);
//System.out.println();
FileNames partname = new FileNames();
partname.GetFileName(partaddress);
//System.out.println(partname.FileName(partaddress));
for (int i = 1; i < listfile.length; i++) {
if (listfile[i].isFile()) {
// boolean status = false;
for (int j = 0; j <= Allname.allName.length; j++) {
boolean status = filename[i].contains(Allname.allName[j]); // !BUG:第0个文件名nulldesktop.ini
// System.out.println(Allname.allName[j]);
if (status) {
String newname = "电商1903-java实验二-" + Allname.allName[j] + ".doc";
File refile = new File(filePath + File.separator + newname);
listfile[i].renameTo(refile);
System.out.println("重命名成功"+newname);
break;
}
}
/* if(check.check(Allname.allName,partname.FileName(partaddress)))
{
for(int j=1;j<=35;j++){
//文件定位
String newname="电商1903-Java实验二"+Check.allName[j]+".doc";
File refile=new File(filePath+File.separator+newname);
listfile[i].renameTo(refile);
}
}*/
System.out.println(listfile[i] + "重命名成功!");
}
}
}
}
结语
如果你觉得这篇文章对你还有点用的话,欢迎打赏博主一块小饼干(o^^o)没有小饼干留下你的小脚印也行(^з^),如果有更好的算法或者功能方面的建议也欢迎评论区或者留言区交流哦(^_^)v