Scanner构造抛出FileNotFoundException的排查与解决求助
解决Java中确认文件存在仍抛出FileNotFoundException的问题
核心原因:读取文件时用错了路径
你提到的“双重判断”大概率是在遍历目录时对找到的目标文件做了校验,但读取时却重新创建了一个仅含文件名的File对象——而这个新对象指向的并不是你找到的那个文件(比如文件在子目录里,你却在程序当前工作目录下查找它)。
简单解决方案
1. 直接用遍历到的File对象读取
遍历目录时,找到Tabelle.csv后直接使用这个现成的File对象创建Scanner,不要手动拼接路径:
import java.io.File; import java.util.Scanner; public class ReadCsv { public static void main(String[] args) throws FileNotFoundException { // 指定要遍历的根目录,比如这里是当前目录下的data文件夹 File rootDir = new File("./data"); traverseDir(rootDir); } public static void traverseDir(File dir) throws FileNotFoundException { if (!dir.isDirectory()) { return; } // 获取目录下的所有文件和子目录 File[] files = dir.listFiles(); if (files == null) { return; } for (File file : files) { if (file.isDirectory()) { // 递归遍历子目录 traverseDir(file); } else { // 匹配目标文件名 if ("Tabelle.csv".equals(file.getName())) { // 直接用找到的file对象创建Scanner Scanner scanner = new Scanner(file); // 读取并打印内容 while (scanner.hasNextLine()) { System.out.println(scanner.nextLine()); } scanner.close(); } } } } }
2. 避免try-catch的方法
Java要求IO操作必须处理异常,如果你不想写try-catch块,可以在方法签名上添加throws FileNotFoundException,让异常向上抛给JVM处理(程序会打印异常信息后终止),上面的代码已经采用了这种方式。
3. 排查其他潜在问题
- 权限不足:文件存在但你没有读取权限。Windows右键文件→属性→安全,检查当前用户的读取权限;Linux/macOS用
ls -l 文件路径查看权限位是否包含r。 - 文件被占用:文件可能被其他程序(比如Excel)锁定,关闭占用程序后重试。
内容的提问来源于stack exchange,提问作者Kralkaz -.-
相关产品推荐
相关产品推荐

