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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:15:43