Java File IO调用getAbsolutePath()返回路径错误导致文件无法打开
问题原因
new File(String fileName) 使用相对路径寻址时,默认基准路径是Java进程的工作目录,而非当前代码所在的包目录。你当前的项目工作目录为 C:/Zaid/College/CE2336/Programs/,所以直接传入文件名会默认在工作目录下查找,不会自动拼接代码所在的包路径 MyImplementations,因此拿到的路径少了一层包结构。
小提示:你原有代码中替换路径斜杠的逻辑不是必须的,Java的File类在Windows环境下可以自动兼容
/和\两种斜杠格式。
解决方案
方案1:拼接包路径前缀(快速适配现有代码)
如果文件固定存放在MyImplementations包下,直接把包名作为路径前缀拼到文件名前即可:
text = new MyArrayList<>(); // 拼接包名作为相对路径前缀 String filePath = new File("MyImplementations/" + fileName).getAbsolutePath(); try { Scanner s = new Scanner(new File(filePath)); while (s.hasNext()) { text.add(s.next()); } s.close(); } catch(FileNotFoundException e){ System.out.println("File not found."); }
方案2:通过类加载器读取同包资源(更稳定)
如果文件和当前类在同一个包下,用类加载器读取资源不受工作目录变动影响,适配性更强:
text = new MyArrayList<>(); // 替换下面的「当前类名」为你这段代码所在的类的名称 InputStream inputStream = 当前类名.class.getResourceAsStream("File.txt"); if (inputStream == null) { System.out.println("File not found."); return; } // 用try-with-resources自动关闭流,不用手动写close逻辑 try (Scanner s = new Scanner(inputStream)) { while (s.hasNext()) { text.add(s.next()); } }
方案3:显式传入绝对路径(适合固定部署场景)
如果文件存放位置可变,可以直接把文件的完整绝对路径作为参数传入程序,不需要依赖相对路径寻址逻辑。
内容的提问来源于stack exchange,提问作者Liferafter
相关产品推荐
相关产品推荐

