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 小时前
Hot100中的:贪心专题
java·数据结构·算法
myloveasuka3 小时前
Java与C++多态访问成员变量/方法 对比
java·开发语言·c++
Andya_net4 小时前
Spring | @EventListener事件机制深度解析
java·后端·spring
lang201509284 小时前
18 Byte Buddy 进阶指南:解锁 `@Pipe` 注解,实现灵活的方法转发
java·byte buddy
重庆小透明4 小时前
【java基础篇】详解BigDecimal
java·开发语言
杰克尼5 小时前
苍穹外卖--day08
java·数据库·spring boot·mybatis·notepad++
lierenvip5 小时前
SQL 建表语句详解
java·数据库·sql
kuntli5 小时前
Spring Bean生命周期全解析
java
ok_hahaha5 小时前
java从头开始-苍穹外卖-day06-微信小程序开发-微信登录和商品浏览
java·微信·微信小程序·小程序
Java面试题总结6 小时前
Spring @Validated失效?原因、排查与高效解决方案全解析
java·spring boot·spring