You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中FileReader无法读取目录内第二个文件的问题求助

问题分析与修复方案

你的问题核心是文件路径处理错误,导致程序尝试在当前工作目录而非你指定的目标目录下读取第二个文件,所以抛出了FileNotFoundException。咱们一步步拆解问题并修复:

核心问题点

  • folder.list()返回的是目录下的文件名(比如testfile.txt),不是完整路径。你用fileReader = new FileReader(files[f1])时,程序会在当前运行目录找这个文件,而非你传入的test dir目录,自然找不到第二个文件。
  • 多余的f1索引变量完全没必要,增强for循环已经在遍历每个文件名,用索引反而容易出错。
  • 手动调用close()关闭流不够安全,一旦代码抛出异常,流可能无法被正常释放。
  • main方法里每次循环都创建新的Scanner,既浪费资源也可能引发输入异常。

修复后的完整代码

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void searchEngine(String dir, String searchTerm) {
        File folder = new File(dir);
        String[] files = folder.list();
        
        if (files == null) {
            System.out.println("指定的目录不存在或者无法访问");
            return;
        }

        System.out.println("Found Files:");
        for (String file : files) {
            System.out.println(file);
        }

        try {
            for (String fileName : files) {
                // 关键:用目录+文件名构建完整路径,确保在指定目录下读取文件
                File targetFile = new File(folder, fileName);
                // try-with-resources自动关闭流,无需手动调用close
                try (FileReader fileReader = new FileReader(targetFile);
                     BufferedReader bufferedReader = new BufferedReader(fileReader)) {

                    ArrayList<Integer> lineMatches = new ArrayList<>();
                    int lineNum = 0;
                    String line;

                    while ((line = bufferedReader.readLine()) != null) {
                        lineNum++;
                        if (line.contains(searchTerm)) {
                            lineMatches.add(lineNum);
                        }
                    }

                    // 输出匹配结果
                    for (int matchLine : lineMatches) {
                        System.out.println("File: " + fileName + " Line: " + matchLine);
                    }
                }
            }
        } catch (FileNotFoundException ex) {
            System.out.println("无法打开文件: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("读取文件出错: " + ex.getMessage());
        }
    }

    public static void main(String[] args) {
        // Scanner只初始化一次,避免重复创建输入流
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("Enter the search term: ");
            String searchTerm = scanner.nextLine();
            System.out.println("Enter each file location: ");
            String dirPath = scanner.nextLine();
            searchEngine(dirPath, searchTerm);
        }
    }
}

关键修改说明

  1. 正确构建文件路径:用new File(folder, fileName)将目录和文件名拼接成完整路径,确保程序在你指定的目录下读取文件,而非当前工作目录。
  2. 移除多余的索引变量:用增强for循环直接遍历文件名,避免索引操作带来的错误。
  3. 使用try-with-resources管理流:自动关闭FileReader和BufferedReader,即使发生异常也能保证资源被正确释放,比手动close更安全。
  4. 规范泛型使用:把ArrayList linematches改成ArrayList<Integer> lineMatches,避免原始类型警告,代码更严谨。
  5. 优化Scanner创建:将Scanner放在循环外,只初始化一次,减少资源浪费。
  6. 增加目录合法性检查:如果folder.list()返回null,说明目录不存在或无法访问,提前提示并终止后续逻辑,避免无意义的报错。

现在运行代码,输入搜索词和目录路径(比如test dir),就能正确遍历目录下的所有文件并查找匹配内容了。

内容的提问来源于stack exchange,提问作者B. Brewer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:14:14