Java8 API文档搜索引擎_使用内存缓冲区优化

本专栏前文已经完成索引模块程序:

https://blog.csdn.net/m0_63299495/article/details/157515700?spm=1011.2415.3001.5331https://blog.csdn.net/m0_63299495/article/details/157515700?spm=1011.2415.3001.5331实现细节:

https://blog.csdn.net/m0_63299495/article/details/157516644?spm=1011.2415.3001.5331https://blog.csdn.net/m0_63299495/article/details/157516644?spm=1011.2415.3001.5331并使用多线程优化构建索引速度:

https://blog.csdn.net/m0_63299495/article/details/157582494?spm=1011.2415.3001.5331https://blog.csdn.net/m0_63299495/article/details/157582494?spm=1011.2415.3001.5331本文介绍另一优化点:使用缓存节省读盘时间。


在之前的程序中,使用FileReader提供的read方法直接读取文件。使用fileReader.read()每次读取一个字符,即使操作系统存在缓存优化,也存在较多的读盘次数。

Java标准库中提供了BufferedReader类,可以搭配FileReader使用。BufferedReader内部内置了一个缓冲区,可以自动地把FileReader中的一些内容预读到内存中,从而减少读盘次数。

修改Paser类的parseContent方法如下:

java 复制代码
// 解析HTML的正文
    public String parseContent(File f) {
//        去标签
//                try (FileReader fileReader=new FileReader(f)){
        try (BufferedReader bufferedReader = new BufferedReader(new FileReader(f),1024 * 1024)){
//            拷贝标志位
            boolean isCopy=true;
//            创建保存结果的StringBuilder
            StringBuilder content=new StringBuilder();
            while(true){
//                使用字符流读取方式fileReader
//                read方法的返回值是整型,当返回-1时表示文件读取结束
//                int ret = fileReader.read();
                int ret = bufferedReader.read();
                if(ret==-1){
                    break;
                }
                char c= (char)ret;
                if(isCopy){
//                    开关打开:进行拷贝
                    if(c=='<'){
                        isCopy=false;
                        continue;
                    }
//                    去除正文信息中的空行:若当前字符为换行符或回车符,则替换为空格
                    if(c=='\n' || c=='\r'){
                        c=' ';
                    }
                    // 其他字符则进行拷贝
                    content.append(c);
                }else{
//                    开关关闭:不进行拷贝
                    if(c=='>'){
                        isCopy=true;
                    }
                }
            }
            return content.toString();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

其中,BufferedReader还支持指定缓冲区大小:

并且其默认缓冲区大小为8KB:

为了确定合适大小的缓冲区,需要参考HTML文件的大小:

可见大多数HTML文件大小都在20~200KB之间,故BufferedReader默认的8KB大小的缓冲区并不合适,可将缓冲区大小默认设置为1MB:

java 复制代码
BufferedReader bufferedReader = new BufferedReader(new FileReader(f),1024 * 1024
相关推荐
阿无,3 分钟前
布隆过滤器
java·算法·哈希算法
Pocker_Spades_A7 分钟前
飞算JavaAI 48分钟能做完Java全栈项目吗?
java·springboot·#ai编程·#飞算javaai·#java代码生成·#aicoding模型·#java开发
步行cgn27 分钟前
MyBatis 一对多关联映射详解
java·后端
用户31268748772031 分钟前
线程池到底怎么调?从源码看懂 ThreadPoolExecutor 的 7 个参数
java
SQL-First布道者1 小时前
持久层框架的评价标准:只有一个
java·spring boot·spring·tomcat·mybatis·spring jdbc
孔明click331 小时前
Sa-Token v1.46.0 发布 🚀,来看看有没有令你心动的功能!
java·sa-token·开源·springboot·权限认证
m0_587383001 小时前
智慧场馆解决方案实战指南:从系统架构到落地部署全解析
java·spring boot·架构·系统架构
ZC跨境爬虫1 小时前
LeetCode 13. 罗马数字转整数(多解法详解 + Java Python 实现)
java·python·leetcode
省长2 小时前
Sa-Token v1.46.0 发布 🚀,来看看有没有令你心动的功能!
java·后端·开源
LayZhangStrive2 小时前
融360 一面
java·面试·后端开发