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
相关推荐
小荷才露尖尖角,早有蜻蜓立上头2 分钟前
过滤器的4种创建方式
java
大圣编蚕12 分钟前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
程序员阿明30 分钟前
idea把插件啥的不默认放在C盘
java·ide·intellij-idea
linweidong1 小时前
中科闻歌Java面试题及参考答案
java·python·大模型·提示词·ai agent·mcp·rag原理
OpenAnolis小助手1 小时前
一句话看透 JVM,SysOM 诊断 Skill 新增 Java 应用诊断能力
java·开发语言·jvm·阿里云·操作系统控制台·sysom
ForteScarlet2 小时前
Kotlin 2.4.20 现已发布,新特性多不多?
android·java·开发语言·开源·kotlin·jetbrains
萧瑟余晖2 小时前
Java深入解析篇六十二之安全机制详解
java·开发语言
小刘在重生~2 小时前
Java 常用类|包装类 装箱拆箱、Integer 缓存面试题
java·python·缓存
Orange_sparkle2 小时前
Pi Agent vs LangGraph:从人机交互、企业 RAG 到持久化工作流的完整选型指南
java·网络·人机交互
Wang's Blog4 小时前
Java框架快速入门: Spring Security+OAuth2之过滤器与过滤器链
java·开发语言·spring