【遇见】---- Java 获取项目下文件路径方式总结

一、背景
  1. 使用开发工具:Eclipse
  2. 开发项目:Java Web 项目
  3. 问题重现:在几天前忙于一个急于上线的项目就没来得及分析总结,现在空下来了就好好整理一下,事情是这样的,那天我在 src 下新建了一个类型为 Source Folderresource资源文件夹(项目中还没有此类文件夹),然后再通过一个工具类获取 resource 下的文件,当时是使用代码 XXX.class.getClassLoader().getResource(filePath) 获取文件,在本机上测试没有问题,接下来上传代码到 SVN,项目经理测试功能,发现使用上述代码获取不到文件,然后仔细看了一下从 SVN 上更新下来的代码,发现 resource 文件夹标志和我本地的不一样。我本机的是在这里插入图片描述,从 SVN 下更新下来的是在这里插入图片描述,后面试着将 SVN 下更新下来的该文件夹进行重命名为 Source Folder 类型的文件夹就能获取到了。
      问题背景就描述到这里,接下来就有一个疑问:为什么将该资源文件夹上传 SVN 后就不是资源文件夹(Source Folder)了,而变成了文件夹(Folder) ?
二、原因分析

  带着上述问题,经过反复测试仔细研究发现,在 Eclipse 中新建一个 Source Folder 时,在项目中 .classpath 文件会增加一行信息,例如上面我创建了一个资源文件夹 resource 时就会在 .classpath 文件中增加一行代码 <classpathentry kind="src" path="resource"/>,这行代码表示 resource 是一个资源文件夹。那么问题为什么将该资源文件夹上传 SVN 后就不是资源文件夹(Source Folder)了,而变成了文件夹(Folder) 这就迎刃而解了,是因为我在上传 SVN 时没有将更改后的 .classpath 文件上传 SVN ,这就造成了项目经理在更新项目后,项目不知道 resource 是资源文件夹,就给当成了文件夹处理。

三、总结

  后来想了想,在Java 项目中通过上述的方式获取文件可靠吗?在 Java Web 项目中有哪些获取文件的方式?
  带着这两个问题从网上找到了答案,然后自己又经过一番测试发现通过上述代码获取文件是可靠的(我那个文件是配置文件,不会改动)。

  首先是我新建一个 Java Web 项目,准备测试环境,目录结构如下:
目录结构
编写测试类获取文件路径:

package com.util;

/**
* @Description 测试获取文件路径
* @author 欧阳
* @since 2019年1月28日 下午4:25:36
* @version V1.0
*/

public class Test {

	public static void main(String[] args) {
		//获取src/ClassPath下的文件 111.txt 的绝对路径
		System.out.println(Test.class.getClassLoader().getResource("111.txt").getPath());
		
		//获取 src/ClassPath的绝对路径
		System.out.println(Test.class.getClassLoader().getResource(".").getPath());
		//获取 src/ClassPath的绝对路径
		System.out.println(Test.class.getClassLoader().getResource("").getPath());
		//获取 src/ClassPath的绝对路径
		System.out.println(Thread.currentThread().getContextClassLoader().getResource(".").getPath());
		//获取 src/ClassPath的绝对路径
		System.out.println(Thread.currentThread().getContextClassLoader().getResource("").getPath());
				
		//获取项目的绝对路径
		System.out.println(System.getProperty("user.dir"));

		//获取当前类文件的绝对目录,不包括自己的上级目录
		System.out.println(Test.class.getResource(".").getPath());
		//获取当前类文件的绝对目录,不包括自己的上级目录
		System.out.println(Test.class.getResource("").getPath());
		
		//获取webRoot下文件(主要是通过上下文获取和通过request)
//		System.out.println(request.getSession().getServletContext().getRealPath("/resource"));
	}

}

获取 src / ClassPath 下文件路径有三种:

  1. Test.class.getClassLoader().getResource("111.txt").getPath();
  2. Test.class.getResource("").getPath();
  3. Thread.currentThread().getContextClassLoader().getResource(".").getPath();

获取 Webroot 下文件路径主要是通过上下文和request进行获取,这块就就演示了,有很明显的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lytao123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值