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

Java程序报错找不到指定文件:单线程高频词统计问题排查

问题分析与解决

核心原因

directoryPath.list()返回的是目录下的文件名(不含完整路径),直接用这个文件名创建File对象时,Java会在当前程序运行的工作目录下查找文件,而非你指定的C:\assignment 3\links目录,因此抛出FileNotFoundException。

修复方案

必须将目录路径与文件名拼接成完整路径,推荐使用File类的构造方法自动处理路径分隔符,同时补充几个潜在问题的修复:

  • 过滤子目录:跳过目录下的文件夹,只处理文件
  • 空目录判断:避免目录为空时触发空指针异常
  • 无符合条件单词的处理:防止文件中没有长度≥5的单词时抛出异常

修复后的完整代码

import java.io.*;
import java.util.*;
import java.util.Map.Entry;

public class SingleThreaded {

    public static void main(String[] args) throws IOException {
        File directoryPath = new File("C:\\assignment 3\\links");
        String[] dir = directoryPath.list();

        // 处理空目录或目录不存在的情况
        if (dir == null || dir.length == 0) {
            System.out.println("目标目录为空或不存在");
            return;
        }

        System.out.println(Arrays.toString(dir));

        long startTime = System.nanoTime();

        for (String fileName : dir) {
            // 拼接完整文件路径
            File file = new File(directoryPath, fileName);
            // 跳过子目录,只处理文件
            if (!file.isFile()) {
                continue;
            }

            // 使用try-with-resources自动关闭资源
            try (Scanner scan = new Scanner(file)) {
                HashMap<String, Integer> map = new HashMap<>();

                while (scan.hasNextLine()) {
                    String line = scan.nextLine().replaceAll("\\p{Punct}", " ");
                    String[] words = line.split("\\s+");

                    for (String word : words) {
                        String lowerCaseWord = word.toLowerCase();
                        if (lowerCaseWord.length() >= 5) {
                            // 简化计数逻辑
                            map.put(lowerCaseWord, map.getOrDefault(lowerCaseWord, 0) + 1);
                        }
                    }
                }

                // 处理无符合条件单词的情况
                if (map.isEmpty()) {
                    System.out.println(fileName + ": 无长度≥5的单词");
                    continue;
                }

                // 获取出现次数最多的单词
                String mostFrequentWord = Collections.max(map.entrySet(), Comparator.comparingInt(Entry::getValue)).getKey();
                System.out.println(fileName + ": " + mostFrequentWord);

            } catch (FileNotFoundException e) {
                System.out.println("无法找到文件: " + fileName);
                e.printStackTrace();
            }
        }

        long endTime = System.nanoTime();
        long totalTime = (endTime - startTime) / 1000;
        System.out.println("Total Time: " + totalTime + " 微秒");
    }
}

关键修改点说明

  • 完整路径构建:通过new File(directoryPath, fileName)确保在指定目录下查找文件
  • 资源自动管理:使用try-with-resources语法,无需手动关闭Scanner,避免资源泄漏
  • 目录过滤:添加!file.isFile()判断,跳过子目录
  • 空值安全处理:增加空目录和空map的判断,避免运行时异常
  • 代码简化:用map.getOrDefault()替代containsKey()的判断逻辑,让代码更简洁

内容的提问来源于stack exchange,提问作者shybutterfly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:45:47