Java中如何使用相对路径读取文件?同目录文件读取失败解决方法
Java文件读取路径问题解决方案
问题核心
你用"input1.txt"读取失败,本质是Java的相对路径基准不是源文件Library.java所在目录,而是JVM启动的工作目录(通常是项目根目录)。即使文件和源文件同目录,运行时程序会去工作目录找,自然找不到。
三种修正方案
方案1:调整文件位置(最简单)
把input1.txt直接放到项目根目录下,原代码的new File("input1.txt")就能正常读取。
方案2:用类加载器读取(推荐,适配打包场景)
通过类加载器获取和Library.class同目录的资源,这种方式不管是开发阶段还是打包成Jar后都能正常工作:
package SimpleLibrarySystem; import java.time.LocalDateTime; import java.util.*; import java.io.*; import java.util.ArrayList; import java.util.HashMap; public class Library { ArrayList<Book> var = new ArrayList<Book>(); HashMap<Book, LocalDateTime> var1 = new HashMap<Book, LocalDateTime>(); public Library(String person, LocalDateTime time) { try { // 用类加载器获取资源输入流 InputStream is = Library.class.getResourceAsStream("input1.txt"); if (is == null) { System.out.println("文件不存在"); return; } Scanner br = new Scanner(is); // 修正循环条件:用hasNextLine判断是否还有内容 while (br.hasNextLine()) { String a = br.nextLine(); // 确保有下一行再读取,避免异常 if (!br.hasNextLine()) break; String b = br.nextLine(); Book a1 = new Book(a, b, person); Book a2 = new Book(a, b, ""); var.add(a2); var1.put(a1, time); // 跳过空行或分隔行,确保循环正常 if (br.hasNextLine()) { br.nextLine(); } } br.close(); is.close(); } catch (Exception e) { // 打印异常详情,方便排查 e.printStackTrace(); } } }
方案3:指定明确相对路径(仅开发阶段可用)
如果不想移动文件,直接写源文件目录的相对路径(从项目根目录出发):
File myfile = new File("src/SimpleLibrarySystem/input1.txt");
注意:这种方式在项目打包成Jar后会失效,因为Jar里没有src目录结构,只适合本地开发调试。
Java相对路径读取关键要点
- 用
System.getProperty("user.dir")可以打印当前工作目录,确认文件应该放的位置。 - 开发时IDE的工作目录默认是项目根目录,打包后Jar的工作目录是运行Jar时所在的系统目录。
- 若要读取和类同目录的资源,优先使用
class.getResourceAsStream(),避免依赖外部目录结构。
内容的提问来源于stack exchange,提问作者Sarveshwar Singh
相关产品推荐
相关产品推荐

