(java)简单设计一个本地搜索,你会怎么实现

news2024/11/25 4:29:29

目录

1. 需求分析

2. 系统设计

主要类

3. Java代码实现

4. 进一步扩展


在Java中实现一个简单的本地搜索功能的设计流程通常包括以下几个步骤:

1. 需求分析

  • 输入:用户输入要索引的目录路径和搜索的关键词。
  • 处理
    • 扫描指定目录及其子目录,读取文件内容并建立索引。
    • 根据用户输入的关键词在索引中查找匹配的文件。
  • 输出:展示匹配文件的列表。

2. 系统设计

主要类
  1. FileIndexer:负责扫描目录和建立索引。
  2. FileSearcher:负责根据关键词进行搜索。
  3. SearchResult:表示搜索结果(可以选择性实现)。
  4. Main:程序入口,包含用户交互逻辑。

3. Java代码实现

这段代码实现了一个简单的文件索引和搜索程序,用户可以输入目录路径,程序会索引该目录中的所有文件,并允许用户通过关键字搜索文件内容。

分为三个主要类:FileIndexerFileSearcherMain。下面是对每个部分的详细分析:

(1)创建一个FileIndexer类,负责读取指定目录下的所有文件,并将文件内容索引到一个Map中,键为文件的绝对路径,值为文件内容。

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;

/**
 * @author water
 * @date 2024/10/5
 */
public class FileIndexer {
  private Map<String, String> index = new HashMap<>();

  // 构建索引
  public void indexFiles(String directoryPath) {
    try {
      File directory = new File(directoryPath);
      if (!directory.isDirectory()) {
        throw new IllegalArgumentException("Provided path is not a directory");
      }
      indexDirectory(directory);
    } catch (Exception e) {
      System.err.println("Error indexing files: " + e.getMessage());
    }
  }

  // 递归索引目录
  private void indexDirectory(File directory) {
    for (File file : directory.listFiles()) {
      if (file.isDirectory()) {
        indexDirectory(file); // 递归索引子目录
      } else {
        indexFile(file);
      }
    }
  }

  // 索引单个文件
  private void indexFile(File file) {
    try {
      String content = new String(Files.readAllBytes(file.toPath()));
      index.put(file.getAbsolutePath(), content); // 使用文件绝对路径作为索引
    } catch (IOException e) {
      System.err.println("Failed to read file: " + file.getAbsolutePath());
    }
  }

  public Map<String, String> getIndex() {
    return index;
  }
}

 一个 Map<String, String> index,用于存储文件名和文件内容的映射关系。

indexFiles(String directoryPath)该方法接收一个目录路径作为参数,并尝试对该目录中的文件进行索引。首先创建一个 File 对象并检查该路径是否是一个目录。如果不是,则抛出 IllegalArgumentException。调用 indexDirectory(File directory) 方法来索引该目录。使用 try-catch 捕获异常并打印错误信息。

indexDirectory(File directory)方法遍历目录中的所有文件和子目录。如果遇到子目录,则递归调用自身来索引子目录。如果遇到文件,则调用 indexFile(File file) 方法进行索引。

indexFile(File file)方法读取文件的内容并将文件名和内容存入 index 中。使用 Files.readAllBytes() 方法读取文件内容,并将其转换为字符串。如果文件读取失败,捕获 IOException 异常并打印错误信息。

getIndex()方法主要是用来返回当前索引的 Map

(2)创建一个FileSearcher类,接受一个索引并根据用户输入的关键词进行搜索,返回匹配的文件路径及其内容。

import java.util.HashMap;
import java.util.Map;

/**
 * @author water
 * @date 2024/10/5
 */
public class FileSearcher {
  private Map<String, String> index;

  public FileSearcher(Map<String, String> index) {
    this.index = index;
  }

  // 根据关键词搜索
  public Map<String, String> search(String keyword) {
    Map<String, String> results = new HashMap<>();
    for (Map.Entry<String, String> entry : index.entrySet()) {
      if (entry.getValue().toLowerCase().contains(keyword.toLowerCase())) {
        results.put(entry.getKey(), entry.getValue());
      }
    }
    return results;
  }
}

index变量用来存储在 FileIndexer 中生成的文件索引。

FileSearcher(Map<String, String> index)构造函数,接收一个索引 Map,并将其存储到 index 属性中。

search(String keyword)方法接收一个关键字作为参数,返回一个 Map<String, String> 类型的搜索结果。遍历索引中的每个条目,检查文件内容是否包含关键字(不区分大小写),如果找到匹配项,则将其加入结果 Map 中。

(3)创建一个Main类,提供用户界面,读取用户输入,调用索引和搜索功能,最后输出搜索结果。

import java.util.Map;
import java.util.Scanner;

/**
 * @author water
 * @date 2024/10/5
 */
public class Main {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    FileIndexer indexer = new FileIndexer();

    // 指定要索引的目录
    System.out.println("Enter the directory to index:");
    String directoryPath = scanner.nextLine();
    System.out.println("You entered: " + directoryPath); // 调试输出

    // 进行搜索
    System.out.println("Enter a keyword to search:");
    String keyword = scanner.nextLine();

    indexer.indexFiles(directoryPath);
    Map<String, String> index = indexer.getIndex();
    System.out.println(index.toString());

    FileSearcher searcher = new FileSearcher(index);
    Map<String, String> results = searcher.search(keyword);
    System.out.println(results.toString());

    // 展示搜索结果
    if (results.isEmpty()) {
      System.out.println("No results found.");
    } else {
      System.out.println("Search Results:");
      for (String fileName : results.keySet()) {
        System.out.println("File: " + fileName);
      }
    }

    scanner.close(); // 关闭Scanner以释放资源
  }
}

创建 Scanner 对象用于读取用户输入。然后,创建 FileIndexer 对象以索引文件,提示用户输入目录路径并读取该路径。调用 indexFiles 方法对该目录进行索引,并获取索引结果。

提示用户输入关键字进行搜索。创建 FileSearcher 对象,并调用 search 方法来查找包含该关键字的文件。

最后,打印搜索结果。如果结果为空,则提示用户未找到结果。

(4)在本地的路径D:\my\else\code-learning\python-study下,目录结构如下所示:

其中,D:\my\else\code-learning\python-study\t.txt这个文件的内容如下,

代码执行结果如下,

确保使用有效的路径输入,例如在Windows中使用C:\\Users\\YourUsername\\Documents,在Unix/Linux中使用/home/yourusername/documents。如果输入路径后程序没有响应,注意检查控制台输出的任何错误消息。

4. 进一步扩展

  • 多线程:可以实现多线程索引和搜索,以提高性能。
  • 图形用户界面(GUI):使用Swing或JavaFX创建更友好的用户界面。
  • 更复杂的搜索:支持正则表达式搜索、模糊匹配等功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2190722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML+CSS之表格(15个案例+代码+效果图+素材)

目录 1.table标签的border属性 案例:制作一个带边框的表格 1.代码 2.效果 2.table标签的cellspacing属性 案例:制作一个带边距的表格 1.代码 2.效果 3.table标签的cellpadding属性 1.代码 2.效果 4.table标签的width和height属性 案例:指定宽高的表格 1.代码 2.效果 5.table标签…

BUSHOUND的抓包使用详解

BUSHOUND是个过滤软件&#xff0c;确切来说是在windows操作系统它的驱动层USB传输的数据。所以这个数据上可能是与USB的总线上的数据是有一点差异的。 先要选择设备的抓包。所以就是在device这个界面底下&#xff0c;我们首先要选择我们要抓的设备。 尝试下键盘设备 电脑键盘…

COPS论文总结——Lec17

文章目录 一、简介二、ALPS1.可用性。2.低延迟。3.分区容忍。4.高可扩展性。5.对比CAP 三、COPS的一致性1.一致性的分类2.Causal 一致性&#xff08;1&#xff09;模型抽象&#xff08;2&#xff09;Causal 定义 一、简介 1.论文的标题是‘Don’t Settle for Eventual: Scalab…

CNN中的平移不变性和平移等变性

1. 平移等变性 数学上函数的等变性定义如下&#xff1a; 也就是给定一张图像&#xff0c;平移后卷积的结果与卷积后再平移的结果是相同的 2. 平移不变性 如果某个属性在任何平移下都不会改变&#xff0c;那么它就是平移不变的。考虑上面的图像。 即使像素值发生了位移&#x…

c++内存申请和释放

// // Created by 徐昌真 on 2024/10/5. // #include <iostream> using namespace std; int main() {//在堆区申请一块内存int* ptr new int(1314); //申请了一个int类型的内存 用ptr指针指向它 它的值是1314cout << *ptr << endl;//可以通过指针修改它的值…

【C++差分数组】1589. 所有排列中的最大和|1871

本文涉及知识点 C差分数组 LeetCode1589. 所有排列中的最大和 有一个整数数组 nums &#xff0c;和一个查询数组 requests &#xff0c;其中 requests[i] [starti, endi] 。第 i 个查询求 nums[starti] nums[starti 1] … nums[endi - 1] nums[endi] 的结果 &#xff…

华为OD机试 - 基站维护工程师数 - 动态规划(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

GEE问题:筛选指定区域的Sentinel-1影像缺乏VH等波段

目录 问题简介 原始代码 原始代码 问题解析 修改后的代码 问题简介 亲爱的同事们&#xff0c;我正在尝试使用 SAR 图像 - Sentinel-1 来改进使用机器学习的地上生物量建模。我想处理 Sentinel 图像并将它们作为波段插入以增强模型。通过阅读文档&#xff0c;可用的极化&a…

前端编程艺术(3)---JavaScript

目录 1.JavaScript 1.输出 2.变量和数据类型 3.运算符 4.数组 5.函数 6.面向对象 7.ES6面向对象 2.BOM 1.document对象 3.DOM 4.JSON 1.JavaScript JavaScript是一种脚本编程语言&#xff0c;通常用于为网页增加交互性和动态效果。它是一种高级语言&#xff…

用js和css实现一行一行文字交替显示

用js和css实现&#xff0c;效果是&#xff1a;有多行文字&#xff0c;一行一行的交替显示&#xff0c;每隔几秒显示一行&#xff0c;循环显示。 代码如下&#xff0c;保存为html即可看到效果&#xff1a; <!DOCTYPE html> <html lang"en"> <hea…

心觉:梦想成真的三个核心步骤

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作190/1000天 梦想成真是每个人的愿望 但是希望你不要把“梦想成真”这四个字当成愿望或许愿&#xff0c;因为它实际上是一个成事的…

为什么芯片有多个不同的供电电压?

一、为什么芯片有多个不同的供电电压&#xff1f; 优化性能与功耗&#xff1a;芯片的核心部分&#xff08;Core&#xff09;和输入输出部分&#xff08;IO&#xff09;可能采用不同的电压。核心电压通常较低&#xff0c;以减少功耗和发热&#xff0c;提高能效&#xff1b;而IO电…

如何解决msvcp140.dll丢失,这6个方法可以解决msvcp140.dll丢失

在日常电脑使用中&#xff0c;可能会遇到一些常见问题&#xff0c;比如msvcp140.dll丢失或损坏。这个问题会导致程序无法正常运行&#xff0c;对我们的生活、工作造成困扰。本文将介绍6种解决msvcp140.dll丢失的方法&#xff0c;让大家能快速解决这个问题。 一&#xff0c;msvc…

25游卡(服务器)面试经验 游卡最常见面试问题总结

目录 【面试经历】 问题+详细答案 面试流程 面试攻略 【面试经历】 秋招目前面了十多家,第一家不开摄像头且表示麦不好要求找个耳机的。贴面经(纯八股) 1.HTTP与HTTPS 2.MTU如何设置,过大过小的后果 3.DNS过程 4.如何创建进程/线程,孤儿进程 5.java从文件到运行的过程…

大厂笔试现已经禁用本地IDE怎么看

如果我说本来面试做题这种事情就是反人类你相信吗&#xff1f; 这个罪恶的源头就是 Google&#xff0c;说是为了选择高素质的计算机编程水平的人才&#xff0c;然后把面试就变成了考试&#xff0c;最大的受益者当然是印度人了。 当把一个考察过程变成标准化的考试过程&#x…

每日一道算法题——二分查找

文章目录 开口闭口区分:1、问题2、示例3、解决方法&#xff08;1&#xff09;注意点&#xff08;2&#xff09;代码 开口闭口区分: 开口闭口区分: [1,2,3] 左闭右闭[1,2,3) 左闭右开(1,2,3] 左开右闭 开口如数组(1,2,3)不包含当前数据&#xff0c;也就是指只有2&#xff0c;闭口…

各省-科技创新、研发强度数据(2007-2022年)

研发强度通常指研究与试验发展&#xff08;R&D&#xff09;经费与国内生产总值&#xff08;GDP&#xff09;之比&#xff0c;是衡量一个国家或地区科技活动强度的重要指标。高研发强度往往意味着更强的科技创新能力和更快的技术进步速度。 从地区分布来看&#xff0c;研发…

什么是 HTTP 请求中的 preflight 类型请求

在浏览器的 HTTP 请求中&#xff0c;当我们使用 fetch API 或者 XMLHttpRequest 来进行跨域请求时&#xff0c;浏览器有时会发送一种称为 Preflight 的请求。这种请求是浏览器在实际发送跨域请求前&#xff0c;先与目标服务器进行的一次 “探测” 请求&#xff0c;以确认服务器…

java基础_异常总结详解

1 列举一些列举常见的运行时异常 运行时异常都是 RuntimeException 子类异常 NullPointerException - 空指针异常 ClassCastException - 类转换异常 IndexOutOfBoundsException - 下标越界异常 ArithmeticException - 计算异常 IllegalArgumentException - 非法参数异常 Numb…

C - Separated Lunch

题目链接: C - Separated Lunch (atcoder.jp) 题目描述: 大致意思是&#xff1a;有n个人&#xff0c;让你把他们分为两个组&#xff0c;然后分完后的这两个组的最大值最小为多少&#xff1f; 数据范围&#xff1a; 样例输入&#xff1a; 5 2 3 5 10 12 样例输出&#xff1a;…