Java项目中FileReader无法找到src目录下words.txt文件求助
解决Java文件读取及单词统计问题
一、文件找不到的问题解决
默认情况下,Java程序的当前工作目录是项目根目录,而非src文件夹。你把words.txt放在src下,用"words.txt"的相对路径自然找不到文件,有三种解决方式:
- 直接把
words.txt移动到项目根目录(和src同级的目录),原代码的路径写法就能生效。 - 用类加载器读取classpath资源(适合打包后仍能读取文件),替换原文件读取代码:
这里的// 替换 Scanner input = new Scanner(new FileReader("words.txt")); Scanner input = new Scanner(Ex1.class.getResourceAsStream("/words.txt"));"/words.txt"是因为src是classpath的根路径,编译后文件会被放到classpath下。 - 用绝对路径(不推荐,换环境会失效),比如
"D:/your-project/src/words.txt"。
二、代码逻辑修正
原代码存在致命逻辑问题:第一个while (input.hasNext())已经把文件内容全部读完,指针走到了文件末尾,第二个while (input.hasNext())根本不会执行,导致统计总单词数永远为0。同时统计不同单词的方式效率较低,优化方案如下:
修正后的完整代码
package Aula12; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.Scanner; public class Ex1 { public static void main(String[] args) { try { // 根据文件位置选择路径,这里示例用项目根目录的路径 Scanner input = new Scanner(new FileReader("words.txt")); ArrayList<String> texto = new ArrayList<>(); HashSet<String> verificador = new HashSet<>(); // 一次读取完成打印、存列表、存去重集合的操作 while (input.hasNext()) { String word = input.next(); System.out.println(word); texto.add(word); verificador.add(word); } int palavras = texto.size(); System.out.println("Número total de palavras: " + palavras); int palavrasdiff = verificador.size(); System.out.println("Número de palavras diferentes: " + palavrasdiff); input.close(); } catch (FileNotFoundException e) { System.out.println("File not found: " + e.getMessage()); } catch (IOException e) { System.out.println("Error reading file: " + e.getMessage()); } } }
优化说明
- 合并读取逻辑:只遍历一次文件,同时完成打印、存储所有单词、存储去重单词的操作,避免重复读取。
- 用
HashSet替代ArrayList做去重:HashSet的contains和add操作效率远高于ArrayList,适合大量数据的去重统计。
内容的提问来源于stack exchange,提问作者Vasco Vouzela
相关产品推荐
相关产品推荐

