最近在做项目的时候,自己写了一些配置参数的读取,将配置文件放到具体的位置,然后让程序根据当前类的路径寻找配置文件的路径,但是,发现eclipse的开发坏境下是可以顺利读取到指定路径下的配置文件中的配置参数的,

但是当将项目放到Tomcat下  或者 将项目打包成可执行jar包之后,编译后的class文件却读取不到了开发环境下寻找的配置文件了。

如果在 .java 文件中直接写// public static  String Config = "config.properties";  则该路径指向的就是项目的 src 的同级目录(直接将配置文件放到项目的根目录下)

经过查找资料和进行验证,现将读取class文件相对路径下配置文件的方法汇总如下:

方法一:使用System获取路径

方法二:使用当前类的ProtectionDomain或者ClassLoader获取路径

方法三:使用Thread获取路径

方法一:

示例:

public static  final String URLConfig = System.getProperty("user.dir").replace("bin", "webapps")+"/URLConfig.properties";//这种是将配置文件放到Tomcat的webapps的目录下

其中的 System.getProperty("user.dir")  为获取用户当前工作目录

java的System.getProperty()方法可以获取的值

获取的代码示例:

public classSystemProperty {public static voidmain(String args[]) {

System.out.println("java_vendor:" + System.getProperty( "java.vendor"));

System.out.println("java_vendor_url:"

+ System.getProperty("java.vendor.url"));

System.out.println("java_home:" + System.getProperty( "java.home"));

System.out.println("java_class_version:"

+ System.getProperty("java.class.version"));

System.out.println("java_class_path:"

+ System.getProperty("java.class.path"));

System.out.println("os_name:" + System.getProperty( "os.name"));

System.out.println("os_arch:" + System.getProperty( "os.arch"));

System.out.println("os_version:" + System.getProperty( "os.version"));

System.out.println("user_name:" + System.getProperty( "user.name"));

System.out.println("user_home:" + System.getProperty( "user.home"));

System.out.println("user_dir:" + System.getProperty( "user.dir"));

System.out.println("java_vm_specification_version:"

+ System.getProperty("java.vm.specification.version"));

System.out.println("java_vm_specification_vendor:"

+ System.getProperty("java.vm.specification.vendor"));

System.out.println("java_vm_specification_name:"

+ System.getProperty("java.vm.specification.name"));

System.out.println("java_vm_version:"

+ System.getProperty("java.vm.version"));

System.out.println("java_vm_vendor:"

+ System.getProperty("java.vm.vendor"));

System.out

.println("java_vm_name:" + System.getProperty( "java.vm.name"));

System.out.println("java_ext_dirs:"

+ System.getProperty("java.ext.dirs"));

System.out.println("file_separator:"

+ System.getProperty("file.separator"));

System.out.println("path_separator:"

+ System.getProperty("path.separator"));

System.out.println("line_separator:"

+ System.getProperty("line.separator"));

}

上面示例引用的博客地址:https://blog.csdn.net/capmiachael/article/details/51895823

方法二:

示例1:

public static String getMyDIR(){//获取当前类文件的绝对路径

String jarWholePath = ConfigerPraram.class.getProtectionDomain().getCodeSource().getLocation().getFile();try{//保险起见,将路径进行decode转码

jarWholePath = java.net.URLDecoder.decode(jarWholePath, "UTF-8");

}catch(UnsupportedEncodingException e) { System.out.println(e.toString()); }//获取jar包的上级目录

String jarPath = newFile(jarWholePath).getParentFile().getAbsolutePath();returnjarPath;

}

示例2:

/*** 获取项目所在路径

*

*@return

*/

public staticString getRealPath() {

//通过类加载器获取jar包的绝对路径

String realPath= MyPath.class.getClassLoader().getResource("")

.getFile();

java.io.File file= newjava.io.File(realPath);

realPath=file.getParentFile().getAbsolutePath(); //获取jar包的上级目录

try{

//路径decode转码

realPath= java.net.URLDecoder.decode(realPath, "utf-8");

}catch(Exception e) {

e.printStackTrace();

}

returnrealPath ;

}

方法三:(该方法还未做验证,引用博客:https://blog.csdn.net/z69183787/article/details/22774537)

Thread.currentThread().getContextClassLoader().getResource("")来得到当前的classpath的绝对路径的URI表示法

Application可以通过new FileInputStream("xx.properties");直接在classes一级获取。关键是有时我们需要通过web修改配置文件,我们不 能将路径写死了。经过测试觉得有以下心得:

1.servlet中读写。如果运用Struts 或者Servlet可以直接在初始化参数中配置,调用时根据servlet的getRealPath("/")获取真实路径,再根据String file = this.servlet.getInitParameter("abc");获取相对的WEB-INF的相对路径。

例:

InputStream input =Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.properties");

Properties prop = new Properties();

prop.load(input);

input.close();

prop.setProperty("abc", “test");

prop.store(new FileOutputStream(path), “–test–");

out.close();

2.直接在jsp中操作,通过jsp内置对象获取可操作的绝对地址。

例:

// jsp页面

String path = pageContext.getServletContext().getRealPath("/");

String realPath = path+"/WEB-INF/classes/abc.properties";

//java 程序

InputStream in = getClass().getClassLoader().getResourceAsStream("abc.properties"); // abc.properties放在webroot/WEB-INF/classes/目录下

prop.load(in);

in.close();

OutputStream out = new FileOutputStream(path); // path为通过页面传入的路径

prop.setProperty("abc", “abcccccc");

prop.store(out, “–test–");

out.close();

3.只通过Java程序操作资源文件

InputStream in = new FileInputStream("abc.properties"); // 相对路径,项目下的路径

OutputStream out = new FileOutputStream("abc.properties");

下面的参考解释引用于博客:https://www.cnblogs.com/gaoxing/p/4703412.html

打个简单的比方,你一个WEB程序,发布到Tomcat里面运行。

首先是执行Tomcat org.apache.catalina.startup.Bootstrap类,这时候的类加载器是ClassLoader.getSystemClassLoader()。

而我们后面的WEB程序,里面的jar、resources都是由Tomcat内部来加载的,所以你在代码中动态加载jar、资源文件的时候,首先应该是使用Thread.currentThread().getContextClassLoader()。如果你使用Test.class.getClassLoader(),可能会导致和当前线程所运行的类加载器不一致(因为Java天生的多线程)。

Test.class.getClassLoader()一般用在getResource,因为你想要获取某个资源文件的时候,这个资源文件的位置是相对固定的。

java的类加载机制(jvm规范)是委托模型,简单的说,如果一个类加载器想要加载一个类,首先它会委托给它的parent去加载,如果它的所有parent都没有成功的加载那么它才会自己亲自来,有点儿像儿子使唤老子的感觉。

如果你使用Test.class.getClassLoader(),可能会导致和当前线程所运行的类加载器不一致 :Class.getClassLoader() returns the class loader for the class. Some implementations may use null to represent the bootstrap class loader. This method will return null in such implementations if this class was loaded by the bootstrap class loader.

java 获取路径_java 获取当前类的路径相关推荐

  1. java当前类路径_java获取当前类的绝对路径

    另,Class类还有一个getResourceAsStream方法,记得以前有个项目要读取在同一个包内的一个xml,就用的这个. 1.如何获得当前文件路径 常用: (1).Test.class.get ...

  2. java src 文件路径_java获取src下文件路径和获取webRoot下文件路径

    获取src下的fileurl.properties文件路径 this.getClass().getResource("/fileurl.properties").getPath() ...

  3. java 访问路径_java获取项目访问路径的相关方法

    java获取项目访问路径的相关方法 刘振兴 代码分享 2016年02月11日 6292 暂无评论 在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是WebRoot 在class文件中 ...

  4. java获取项目在tomcat中路径_java获取项目地址或tomcat绝对地址

    在java项目中获取文件的路径,不管是相对路径还是绝对路径,其本质都是通过绝对路径去寻找. 获取项目地址 request.getSession().getServletContext().getRea ...

  5. java 获取包路径_java获取java文件路径的四种方法

    java获取java文件路径的四种方法 发布时间:2020-04-17 11:03:45 来源:亿速云 阅读:750 作者:小新 今天小编给大家分享的是java获取java文件路径的四种方法,很多人都 ...

  6. java 访问路径_java获取项目访问路径的方法

    在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是WebRoot 在class文件中,例如: WebRoot/WEB-INF/classes 当然你也可以用System.getPro ...

  7. java 运行os文件路径_Java获取文件路径的几种方式

    关于绝对路径和相对路径: 绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:xyz est.txt 代表了test.txt文件的绝对路径. http://www.su ...

  8. java读取src xml文件路径_Java获取路径方法相对路径读取xml文件方法

    (1).request.getRealPath("/");//不推荐使用获取工程的根路径 (2).request.getRealPath(request.getRequestURI ...

  9. java获取服务器路径_JAVA获取服务器路径的方法

    1.在JSF环境中获取到ServletContext: 2.servlet中获得项目绝对路径 根目录所对应的绝对路径 request.getServletPath(); 文件的绝对路径 request ...

最新文章

  1. 2022-01-04
  2. 博客从“新浪云“迁移到CSDN的说明
  3. leetcode 714. 买卖股票的最佳时机含手续费(dp)
  4. python数学建模可视化,[Python与数学建模-数据处理与可视化]-3数据处理工具Pandas...
  5. 荒唐可笑的文言文编程语言
  6. testbench文件显示波形_十大基本功之testbench
  7. 【GPU精粹与Shader编程】(一) 开篇 全系列11本书核心知识点总览
  8. php二维数组声明方式,二维数组怎么定义
  9. ACL——拒绝源地址
  10. linux系统下的动态壁纸,动态壁纸给Linux发行版添加活力背景
  11. stripe海外支付
  12. 学python千万别想当然
  13. 计算机制作通知的具体步骤,步骤 10:创建通知模板和订阅(可选)
  14. 技术人员如何创业:打造超强执行力团队
  15. Docker、nvidia-container-toolkit安装与常用docker命令及docker镜像和容器的更新维护
  16. 护士副高需要计算机考试吗,护士晋升副高的条件
  17. 软件包下载地址(一)
  18. iOS 花式二维码生成和二维码识别
  19. c语言扫雷游戏构成原理,扫雷游戏的C语言实现
  20. 致远项目管理SPM系统进度控制之进度对比分析

热门文章

  1. 怎么样做好手机网站的优化和推广呢?
  2. tnsnames.ora 的编写
  3. MySql的备份与恢复
  4. 21世纪商业运作平台:云计算(Cloud Computing)
  5. oracle数据库创建用户
  6. 【WPF】TextBox样式重写注意事项
  7. [转]MIPS 下非对齐访问的问题
  8. 手势UIGestureRecognizer
  9. [转载]对 Linux 专家非常有用的 20 个命令
  10. tablix“Tablix1”有一个具有内部成员的详细信息成员