2

大家好,我是二哥!

很早之前,就有小伙伴给我反馈说《Java 程序员进阶之路》经常有图片不显示或者加载缓慢。

但由于白嫖(GitHub图床+jsdelivr CDN)的力量实在是太过强大了(狗头),再加上我本人没有遇到过这个问题,所以就一直拖延着,迟迟没有行动。

直到某一天,我神秘的流量用光了,上不去了谷歌,访问不了 X 网,我才发现,原来我的网站加载图片这样慢啊!!!!经常是一蹦一蹦出来的,肉眼(带近视镜)可见的慢。

事没到自己头上,显然高高挂起,可一旦事搁到自己头上,就受不了了呀!

于是我打开站长工具检测了一下图片的访问速度,好家伙,我直接好家伙!国内的访问速度能飙到 100ms,国外的确实快,只有 14.7ms,

要知道,网站面对的用户群体大多数都是国内的小伙伴,这速度,真的是劝退用户!

再加上我今天看到小林把自己的网站也升级了自己的图床,所以我就也按捺不住了。

怎么办?

不可能一个个手动替换啊,《Java 程序员进阶之路》上少说也有 200 篇文章,一篇文章平均 5 张图片的话,也得 1000 张吧,全部替换下来还不得疯!

由于我本地已经分门别类的保存了所有的图片,就只剩下:

  • 第一步,把图片上传到某云厂商
  • 第二步,批量替换所有文章中的图片链接为新图床的地址

替换链接的思路也比较简单,就是读取所有 md 文件,找到其中的图片地址,按照下图的方式替换即可。

第一步,上传图库到云厂商

直接选择扫描文件夹就可以把所有的图片上传到新的图床里。

PS:这里有个坑,不知道有眼尖的小伙伴看出来了没?

第二步,开启 CDN

只使用 OSS 的话,除了流量计费比较高一点外,就是图片没有进行加速服务,所以我就顺带开启了 CDN 服务。开启方法非常简单,只需要将域名回源到 OSS 就可以了。

第三步,编写 Java 代码批量转链

@Slf4j
public class ConvertAllFileWithPool {
    public static final String img_url_pre_before = "https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/";
    private final static String img_url_pre_after = "http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/images/";
    private final static String docPath = "/Users/maweiqing/Documents/GitHub/toBeBetterJavaer/docs/";

    public static void main(String[] args) throws IOException {
        // 递归遍历目录以及子目录中的所有文件
        List<File> files = FileUtil.loopFiles(docPath);
        log.info("总文件数{}",files.size());

        ExecutorService executorService = Executors.newCachedThreadPool();
        for (File file: files) {
            if (FileNameUtil.isType(file.getName(), "md")) {
                log.info("MD 文件{}", file.getName());
                executorService.submit(() -> {
                    FileReader fileReader = FileReader.create(file, Charset.forName("utf-8"));
                    String result = fileReader.readString().replaceAll(img_url_pre_before,img_url_pre_after);
                    log.info("转换完毕");
                    try {
                        FileWriter writer = new FileWriter(file);
                        writer.write(result);
                        writer.flush();
                    } catch (IOException e) {
                        log.error("写入文件出错了{}", e);
                    }
                });
            }
        }
    }
}

思路非常简单,也没有多少行代码:

  • 通过 hutool 的 FileUtil.loopFiles() 方法递归遍历目录以及子目录中的所有文件;
  • 通过 Executors.newCachedThreadPool() 创建一个缓存线程池,由于最多 1087 个文件,所以不用担心线程池资源耗尽;也就不用严格按照阿里手册上强制要求的不能使用 Executors 创建线程池,因地制宜;
  • 循环遍历所有文件,通过 FileNameUtil.isType() 过滤掉不是 md 的文件;
  • 通过 FileReader 读取文件内容,并通过 String 类的 replaceAll() 方法替换原有的图片链接;
  • 通过 FileWriter 重新写入文件;

来看一下执行日志:

17:29:30.547 [main] INFO top.image.ConvertAllFileWithPool - 总文件数1087
。。。
17:29:30.649 [main] INFO top.image.ConvertAllFileWithPool - MD 文件flow-control.md
17:29:30.649 [pool-1-thread-12] INFO top.image.ConvertAllFileWithPool - 转换完毕
17:29:30.649 [pool-1-thread-4] INFO top.image.ConvertAllFileWithPool - 转换完毕
17:29:30.649 [pool-1-thread-8] INFO top.image.ConvertAllFileWithPool - 转换完毕
17:29:30.649 [pool-1-thread-5] INFO top.image.ConvertAllFileWithPool - 转换完毕

基本上不到一秒钟就完成了,因为有 GitHub 作为版本仓库,所以我们可以放心大胆地执行,不用担心出错,大不了重来就是了。

大概检查几个文件后,发现 OK,就可以把修改后的文件提交到版本库了。

重新部署网站后,打开站长工具重新测试了一下图片的访问速度,这次就快多了,国内基本上都是在 20ms 左右,这比原来的 100ms 快了五分之四啊!

早知道这样子,我就早切换链接了!

小插曲

本地图片上传 OSS 的时候一点没注意,多了一个 images 的目录,就导致我构建网站后,发现图片全部挂了!

人慌了好一阵子,OSS 也没提供移动资源的功能,索性就只能在 md 文件中多加了一个 images 目录,这下只能将错就错了。

充了 100 块钱,不知道能用多久,OSS+CDN,链接中没敢用 HTTPS,因为 HTTPS 也收费,就先用 HTTP 了。

好了,今天是五一劳动节后第一天上班(昨天全员核酸),大早上起来我就在星球里制定了五月份的学习计划,不少球友都响应了,也制订了自己的学习计划。

药卷一起卷(狗头)


强烈推荐一波 GitHub 上星标 2k+ star 的开源专栏《Java 程序员进阶之路》,据说每一个优秀的 Java 程序员都喜欢她,风趣幽默、通俗易懂。内容包括 Java 基础、Java 并发编程、Java 虚拟机、Java 企业级开发、Java 面试等核心知识点。学 Java,就认准 Java 程序员进阶之路😄。

https://github.com/itwanger/toBeBetterJavaer

star 了这个仓库就等于你拥有了成为了一名优秀 Java 工程师的潜力。

没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟


沉默王二
955 声望8.6k 粉丝

《Java 程序员进阶之路》作者,网址:[链接]