最近学 Java Web 的过程又复习了 Java IO 的部分,做到一个遍历文件夹并找出匹配内容关键字文件的练习,突然想到自己之前一直在烦 md 图片管理的问题,就尝试动手了,初期还挺顺利,不过后面的问题越来越超出搜索能解决的范围,现将现状列举如下:
1 遍历 md 文件夹的每一个文件,逐列读取文件内容
2 通过正则表达式匹配 md 文件内的所有图片路径,并逐一打印
3 打印的路径使用字符串列表存储,将其与指定本地的 md 图片文件夹内文件路径做一一对比,标记没有匹配到 md 文件夹对应引用路径的文件并删除
已知匹配 md 图片内的正则表达式是!\\[.*\\]\\(.+\\)
, 那如何在该表达式的基础上提取出括号内的路径?
如果 md 文件内引用的是相对路径,如何找到其绝对路径?
md 文件内图片路径数和本地 md 图片仓库图片路径数各自都有几十条暴力匹配不是问题,但是如果几百几千几万呢?如何构建高效的算法? (对应 3)
答:目前思路是,将两个文件夹的图片路径都按名称排序,这样遍历本地 md 图片仓库的每个路径时只需按同一下标内的值是否对应便能识别出孤儿路径。
对于网络路径,如何将对应网络仓库的图片路径取出来遍历对比?
public static void main(String[] args) throws IOException {
searchFolder("E:\\AARON\\myNetNotes\\Book-Audio-Game-Recording","!\\[.*\\]\\(.+\\)");
}
public static void searchFolder(String path, String regex) {
File target = new File(path);
if(!target.exists()){
System.out.println("No such file or Directory!");
return;
}
File[] list = target.listFiles();
for(File f : list){
try {
Scanner sc = new Scanner(new FileReader(f));
String traceStr = new String();
Pattern pattern = Pattern.compile(regex);
// 逐字读取文件内容,寻找匹配的部分
while(sc.hasNext()){
traceStr += sc.next();
if(pattern.matcher(traceStr).find()){
System.out.println(traceStr + " " + f.getName() );
traceStr = "";
}
}
}
catch (IOException e){
e.printStackTrace();
}
}
}
![]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210809101032399.png) @图书 @@中断 @代码简洁之道-Robert.C.Martin.md
![image-20210808105119037]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210808105119037.png) @图书 @@在看 @算法 4#Programming Life##数据结构与算法#.md
![image-20210807151233776]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210807151233776.png) @图书 @@看完 @C Primer Plus#Programming Life#.md
![Snipaste_2021-08-09_20-58-01](../typora-user-images/Snipaste_2021-08-09_20-58-01.png) @图书 @@看完 @分析与思考.md
![image-20210807161124948]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210807161124948.png) @图书 @@看完 @分析与思考.md
![image-20210807161124948]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210807161124948.png) @图书 @@看完 @君主论.md
![image-20210807154606701]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210807154606701.png) @图书 @@看完 @影响力.md
![img](file:///C:\Users\hw\AppData\Local\Temp\ksohtml15116\wps1.jpg) @图书 @@看完 @编码:隐匿在计算机软硬件背后的语言#计算机通识#.md
![image-20210807161737900]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210807161737900.png) @影视 @@看完 @动物新世代 BNA.md
![image-20210807161916802]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210807161916802.png) @影视 @@看完 @小偷家族.md
![image-20210807162338711]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210807162338711.png) @影视 @@看完 @新世纪福音战士.md
![image-20210807162114203]( https://gitee.com/tracker647/typora-pic/raw/master/img/image-20210807162114203.png) @影视 @@看完 @时光代理人.md
Process finished with exit code 0
1
pupboss 2021-09-16 18:25:16 +08:00
任务拆解方面可以提高一点,降低你实现的复杂度
你把所有图片 url 匹配出来,这存成一个数组 再把本地图片文件夹遍历一下,存成另一个数组 假设你的本地图片只会多不会缺,你把两个数组求差就行了,随后删除本地文件 我上周刚做过,你可以参考下实现: https://www.pupboss.com/post/2021/blog-optimization-ghost-routing-rss-darkmode/#topic-3 |
2
ysc3839 2021-09-16 21:43:20 +08:00 via Android
1. Capturing group,简单说就是给要提取的部分加上括号 https://regex101.com/r/ZCdrFB/1
2. 你有 md 文件的路径吧?那配合路径操作的库就能实现了。 3. 我的想法是 hash set 。 |