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
相关产品推荐
相关产品推荐

