news 2026/6/23 10:54:33

springboot中File默认路径

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
springboot中File默认路径

springboot中File默认路径

1. 背景

在Springboot项目开发中,针对文件解析类业务,以及文件生成类业务,正对默认的文件路径比较容易混淆,这里通过代码示例,记录每一种方式对应的默认路径.方便以后开发中快速查询.

项目信息如下:

项目目录: D:\projects\javaprj

项目名称: springboottest

POM文件路径: D:\projects\javaprj\springboottest\pom.xml

需要依次测试一下几种情况

参数为 ""

参数为 "."

参数为 "./"

参数为 "../"

参数为 "/"

2. 获取文件(资源)几种方式

3. 通过File类获取文件默认路径

File通过File(String pathname)构造函数传递具体的路径信息,得到文件默认路径.getCanonicalPath是获取对应串的真实路径,路径上会去掉路径相对表示../.测试代码如下:

// 小游戏 地心侠士 公众号:小满小慢

public static void filePath() throws IOException {

System.out.println("=========小游戏 地心侠士 File类默认路径=========");

File file = new File("");

System.out.println("File \"\" 路径: " + file.getCanonicalPath());

file = new File(".");

System.out.println("File \".\" 路径: " + file.getCanonicalPath());

file = new File("./");

System.out.println("File \"./\" 路径: " + file.getCanonicalPath());

file = new File("../");

System.out.println("File \"../\"路径: " + file.getCanonicalPath());

file = new File("/");

System.out.println("File \"/\" 路径: " + file.getCanonicalPath());

}

以上代码对应输输出结果如下:

=========小游戏 地心侠士 File类默认路径=========

File "" 路径: D:\projects\javaprj\springboottest

File "." 路径: D:\projects\javaprj\springboottest

File "./" 路径: D:\projects\javaprj\springboottest

File "../"路径: D:\projects\javaprj

File "/" 路径: D:\

打包把springboottest-0.0.1-SNAPSHOT.jar放在D:\,jdk所在的目录:C:\Program Files\Java\jdk17.0.8\bin,切换到jdk所在的目录执行如下命令:java -jar d:\springboottest-0.0.1-SNAPSHOT.jar,得到的输出结果如下:

=========小游戏 地心侠士 File类默认路径=========

File "" 路径: C:\Program Files\Java\jdk17.0.8\bin

File "." 路径: C:\Program Files\Java\jdk17.0.8\bin

File "./" 路径: C:\Program Files\Java\jdk17.0.8\bin

File "../"路径: C:\Program Files\Java\jdk17.0.8

File "/" 路径: C:\

切换到jar所在目录执行如下命令:"C:\Program Files\Java\jdk17.0.8\bin\java.exe" -jar springboottest-0.0.1-SNAPSHOT.jar

得到的输出结果如下:

=========小游戏 地心侠士 File类默认路径=========

File "" 路径: D:\

File "." 路径: D:\

File "./" 路径: D:\

File "../"路径: D:\

File "/" 路径: D:\

从以上场景中,可以知道在调用File(String pathname)构造函数时,得到如下结论

参数" ",".","./"都指向相同的目录.

支持相对目录写法, 如"../"会向上一级目录.

参数"/",表示获取工作目录的跟目录

默认目录和jar包所在的目录并没有关系.只和工作目录有关系

可以通过以下代码获取到工作目录:

--小游戏 地心侠士

String workingDir = System.getProperty("user.dir");

System.out.println("当前工作目录为: "+workingDir);

如果想要输出目录始终一直,可以在启动时指定工作目录,可以使用-Duser.dir修改,如启动命令调整为:java -Duser.dir=D:\ -jar d:\springboottest-0.0.1-SNAPSHOT.jar此时,Filel类的默认目录一定是为D:\

4. 通过Class类获取文件默认路径

使用class的getResource()方法获取文件默认路径.为了说明问题,特地使用处于不同包的两个类测试

com.RootClass

com.herbert.springboottest.SpringboottestApplication

测试代码如下:

public static void classgetResource() {

System.out.println("===小游戏 地心侠士 class.getResource 默认路径===");

URL resource = SpringboottestApplication.class.getResource("");

System.out.println("class.getResource \"\" 路径: " + resource.getPath());

resource = SpringboottestApplication.class.getResource(".");

System.out.println("class.getResource \".\" 路径: " + resource.getPath());

resource = SpringboottestApplication.class.getResource("./");

System.out.println("class.getResource \"./\"路径: " + resource.getPath());

resource = SpringboottestApplication.class.getResource("../");

System.out.println("class.getResource \"../\"路径: " + resource.getPath());

resource = SpringboottestApplication.class.getResource("/");

System.out.println("class.getResource \"/\" 路径: " + resource.getPath());

}

以上代码对应的输出结果如下:

===小游戏 地心侠士 class.getResource 默认路径===

class.getResource "" 路径: /D:/projects/javaprj/springboottest/target/classes/com/herbert/springboottest/

class.getResource "." 路径: /D:/projects/javaprj/springboottest/target/classes/com/herbert/springboottest/

class.getResource "./"路径: /D:/projects/javaprj/springboottest/target/classes/com/herbert/springboottest/

class.getResource "../"路径: /D:/projects/javaprj/springboottest/target/classes/com/herbert/

class.getResource "/" 路径: /D:/projects/javaprj/springboottest/target/classes/

RootClass.getResource "" 路径: /D:/projects/javaprj/springboottest/target/classes/com/

打包成jar后执行,不管工作目录如何,class.getResource()方法得到的目录都是jar包所在目录.

===小游戏 地心侠士 class.getResource 默认路径===

class.getResource "" 路径: nested:/D:/springboottest-0.0.1-SNAPSHOT.jar/!BOOT-INF/classes/!/com/herbert/springboottest/

class.getResource "." 路径: nested:/D:/springboottest-0.0.1-SNAPSHOT.jar/!BOOT-INF/classes/!/com/herbert/springboottest/

class.getResource "./"路径: nested:/D:/springboottest-0.0.1-SNAPSHOT.jar/!BOOT-INF/classes/!/com/herbert/springboottest/

class.getResource "../"路径: nested:/D:/springboottest-0.0.1-SNAPSHOT.jar/!BOOT-INF/classes/!/com/herbert/

class.getResource "/" 路径: nested:/D:/springboottest-0.0.1-SNAPSHOT.jar/!BOOT-INF/classes/!/

RootClass.getResource "" 路径: nested:/D:/springboottest-0.0.1-SNAPSHOT.jar/!BOOT-INF/classes/!/com/

从测试结果可以知道

" ",".","." 都指向当前class所在的目录.

支持相对目录写法, 如"../"会向上一级目录.

"/"指向classes目录或者class所在jar的根目录.

和工作目录没有关系.和class在哪里有关系

5. 通过ClassLoader类获取文件默认路径

使用classloader的getResource()方法获取文件默认路径

测试代码如下:

public static void classLoaderGetResource(ClassLoader classLoader) {

System.out.println("===小游戏 地心侠士 classLoader.getResource 默认路径===");

System.out.println("classLoader信息: " + classLoader.getName() + " " + classLoader.getClass().getSimpleName());

URL resource = classLoader.getResource("application.properties");

System.out.println("classLoader.getResource \"\" 路径: " + resource.getPath());

resource = classLoader.getResource(".");

System.out.println("classLoader.getResource \".\" 路径: " + resource.getPath());

resource = classLoader.getResource("./");

System.out.println("classLoader.getResource \"./\" 路径: " + resource.getPath());

resource = classLoader.getResource("com");

System.out.println("classLoader.getResource \"com\" 路径: " + resource.getPath());

// 不支持上级目录

resource = classLoader.getResource("../");

if (resource != null) {

System.out.println("classLoader.getResource \"../\" 路径: " + resource.getPath());

} else {

System.out.println("classLoader.getResource \"../\" 路径: 不支持 ");

}

// 不支持绝对目录

resource = classLoader.getResource("/");

System.out.println("classLoader.getResource \"/\" 路径: 不支持");

}

AppClassLoader 执行情况

测试代码: classLoaderGetResource(ClassLoader.getSystemClassLoader()) 在IDE中输输出结果如下:

===小游戏 地心侠士 classLoader.getResource 默认路径===

classLoader信息: app AppClassLoader

classLoader.getResource "" 路径: /D:/projects/javaprj/springboottest/target/classes/application.properties

classLoader.getResource "." 路径: /D:/projects/javaprj/springboottest/target/classes/

classLoader.getResource "./" 路径: /D:/projects/javaprj/springboottest/target/classes/

classLoader.getResource "com" 路径: /D:/projects/javaprj/springboottest/target/classes/com

classLoader.getResource "../" 路径: 不支持

classLoader.getResource "/" 路径: 不支持

打包成jar后执行,直接获取不到resouce,直接报错,可能与我打包的fat包有关系.

PlatformClassLoader 执行情况

测试代码: classLoaderGetResource(ClassLoader.getPlatformClassLoader()) 在IDE中输输出结果如下:

无论是IDE中,还是打包成jar执行,都获取不到对应resource.

通过两类系统classloader的测试,总结如下

classLoader.getResource 受类加载器影响明显,不建议直接使用

class.getResource 相对于类所在路径,比较清晰

6. 使用ResourceUtils获取资源

Spring提供的工具类了 ResourceUtils 获取资源,测试代码如下

public static void springResourceUtilsFilePath() throws IOException {

System.out.println("=========小游戏 地心侠士 ResourceUtils类默认路径=========");

File file = ResourceUtils.getFile("");

System.out.println("ResourceUtils \"\" 路径: " + file.getCanonicalPath());

file = ResourceUtils.getFile(".");

System.out.println("ResourceUtils \".\" 路径: " + file.getCanonicalPath());

file = ResourceUtils.getFile("./");

System.out.println("ResourceUtils \"./\" 路径: " + file.getCanonicalPath());

file = ResourceUtils.getFile("../");

System.out.println("ResourceUtils \"../\"路径: " + file.getCanonicalPath());

file = ResourceUtils.getFile("/");

System.out.println("ResourceUtils \"/\" 路径: " + file.getCanonicalPath());

file = ResourceUtils.getFile("classpath:application.properties");

System.out.println("ResourceUtils classpath: 路径: " + file.getCanonicalPath());

file = ResourceUtils.getFile("file:application.properties");

System.out.println("ResourceUtils file: 路径: " + file.getCanonicalPath());

}

IDE运行后输出结果如下

=========小游戏 地心侠士 ResourceUtils类默认路径=========

ResourceUtils "" 路径: D:\projects\javaprj\springboottest

ResourceUtils "." 路径: D:\projects\javaprj\springboottest

ResourceUtils "./" 路径: D:\projects\javaprj\springboottest

ResourceUtils "../"路径: D:\projects\javaprj

ResourceUtils "/" 路径: D:\

ResourceUtils classpath: 路径: D:\projects\javaprj\springboottest\target\classes\application.properties

ResourceUtils file: 路径: D:\projects\javaprj\springboottest\application.properties

打包把springboottest-0.0.1-SNAPSHOT.jar放在D:\,jdk所在的目录:C:\Program Files\Java\jdk17.0.8\bin,切换到jdk所在的目录执行如下命令:java -jar d:\springboottest-0.0.1-SNAPSHOT.jar,得到的输出结果如下:

=========小游戏 地心侠士 ResourceUtils类默认路径=========

ResourceUtils "" 路径: C:\Program Files\Java\jdk17.0.8\bin

ResourceUtils "." 路径: C:\Program Files\Java\jdk17.0.8\bin

ResourceUtils "./" 路径: C:\Program Files\Java\jdk17.0.8\bin

ResourceUtils "../"路径: C:\Program Files\Java\jdk17.0.8

ResourceUtils "/" 路径: C:\

ResourceUtils classpath: 路径: class path resource [application.properties] cannot be resolved to absolute file path because it does not reside in the file system: jar:nested:/D:/springboottest-0.0.1-SNAPSHOT.jar/!BOOT-INF/classes/!/application.properties

ResourceUtils file: 路径: C:\Program Files\Java\jdk17.0.8\bin\application.properties

切换到jar所在目录执行如下命令:"C:\Program Files\Java\jdk17.0.8\bin\java.exe" -jar springboottest-0.0.1-SNAPSHOT.jar

得到的输出结果如下:

=========小游戏 地心侠士 ResourceUtils类默认路径=========

ResourceUtils "" 路径: D:\

ResourceUtils "." 路径: D:\

ResourceUtils "./" 路径: D:\

ResourceUtils "../"路径: D:\

ResourceUtils "/" 路径: D:\

ResourceUtils classpath: 路径: class path resource [application.properties] cannot be resolved to absolute file path because it does not reside in the file system: jar:nested:/D:/springboottest-0.0.1-SNAPSHOT.jar/!BOOT-INF/classes/!/application.properties

ResourceUtils file: 路径: D:\application.properties

通过ResourceUtils测试,总结如下:

不同场景下运行程序得到到的默认路径同File保持一致特性.同工作目录强相关.

使用Spring的classpath前缀获取文件时,默认从运行的jar包查找

使用Spring的file前缀获取文件时,默认从当前根目录查找

7. 总结

ResourceUtils 和 File 类使用路径获取资源时,是以工作目录为参考

class.getResource 方法使用路径参数获取资源时,是以这个类的位置为参考

classLoader.getResource正常情况下以classpth目录为基准,不支持路径参数不支持绝对路径.并且java9使用模块化机制,影响很大

不管那种方式"",".","./"都表示当前目录

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 5:55:55

【2025年AI 编程时代的热点】

AI 编程与团队组织变革 AI 编程的成熟将显著改变团队结构和人才需求。传统开发团队中编码占比高的角色可能缩减,而具备AI工具链整合能力、业务理解深度和跨领域协作能力的人才需求上升。团队结构趋向扁平化,产品经理、工程师与AI工具的协作更紧密&#…

作者头像 李华
网站建设 2026/6/22 5:37:55

【C++ 笔记】从 C 到 C++:核心过渡 (中)

前言: 前文中,我们系统学习了 namespace 机制(有效地解决了命名冲突问题,包含指定访问、部分展开和全部展开三种使用方式),同时了解了 cin/cout 输入输出流(具备自动类型识别和支持自定义类…

作者头像 李华
网站建设 2026/6/22 13:42:41

SQL约束解析

约束分类:NOT NULL 非空约束:字段必须有值UNIQUE 唯一约束:值不能重复,但允许多个 NULLPRINARY KEY 主键约束:既是 NOT NULL 又是 UNIQUEDEFAULT 默认约束: 保存数据时.如果未指定该字段的值,则采用默认值CHECK 检查约束:保证字段满足某一个值FOREIGN KEY 外键约束…

作者头像 李华
网站建设 2026/6/21 4:05:10

地铁调研12-17

今天地铁调研主要内容包括:1.跟随工人使用道尺进行巡检。主要测量内容:轨道内距,轨道水平情况。记录:/-x,毫米。2.涂油板(道岔变轨部分)的油是否还有。3.扣配件的螺栓是否松动扣配件的情况&…

作者头像 李华
网站建设 2026/6/22 19:04:16

现代软件测试工具全景对比与选型指南

随着敏捷开发与DevOps实践的普及,软件测试工具生态呈现百花齐放态势。截至2025年末,测试工具已从简单的BUG记录工具发展为覆盖自动化测试、性能监控、安全检测的完整解决方案。本文将通过功能性对比、适用场景分析及成本效益评估三个维度,为测…

作者头像 李华
网站建设 2026/6/21 19:30:15

基于 Apache POI 的体检报告 Word 生成实战文档

基于 Apache POI 的体检报告 Word 生成实战文档一 项目目标与总体设计 目标:基于模板快速生成排版规范的体检报告,支持文本替换、动态表格、图片插入,并可一键导出 PDF 用于归档与打印。技术选型: Apache POI XWPF:操作…

作者头像 李华