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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 13:12:37