JAVA获取文件的路径方法(获取classpath路径)

ClassLoader 提供了两个方法用于从装载的类路径中取得资源:

        public URL  getResource (String name);
        public InputStream  getResourceAsStream (String name);
这里name是资源的类路径,它是相对与"/"根路径下的位置。getResource得到的是一个URL对象来定位资源,而getResourceAsStream取得该资源输入流的引用保证程序可以从正确的位置抽取数据。
但是真正使用的不是ClassLoader的这两个方法,而是Class的 getResource和getResourceAsStream方法,因为Class对象可以从你的类得到(如YourClass.class或 YourClass.getClass()),而ClassLoader则需要再调用一次YourClass.getClassLoader()方法,不过根据JDK文档的说法,Class对象的这两个方法其实是"委托"(delegate)给装载它的ClassLoader来做的,所以只需要使用 Class对象的这两个方法就可以了。

       因此,直接调用  this.getClass().getResourceAsStream(String name) ;获取流,
                静态化方法中则使用ClassLoader.getSystemResourceAsStream (String name) ; 。

      下面是一些得到classpath和当前类的绝对路径的一些方法。你可能需要使用其中的一些方法来得到你需要的资源的绝对路径。

1.this.getClass().getResource("")
得到的是当前类class文件的URI目录。不包括自己!
如:file:/D:/workspace/jbpmtest3/bin/com/test/

2.this.getClass().getResource("/")
得到的是当前的classpath的绝对URI路径 。
如:file:/D:/workspace/jbpmtest3/bin/

3.this.getClass() .getClassLoader().getResource("")
得到的也是当前ClassPath的绝对URI路径 。
如:file:/D:/workspace/jbpmtest3/bin/

4.ClassLoader.getSystemResource("")
得到的也是当前ClassPath的绝对URI路径 。
如:file:/D:/workspace/jbpmtest3/bin/

5.Thread.currentThread().getContextClassLoader ().getResource("")
得到的也是当前ClassPath的绝对URI路径 。
如:file:/D:/workspace/jbpmtest3/bin/

6.ServletActionContext.getServletContext().getRealPath("/")
Web应用程序 中,得到Web应用程序的根目录的绝对路径。这样,我们只需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。
如:file:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/WebProject

注意点:

1.尽量不要使用相对于System.getProperty("user.dir")当前用户目录的相对路径。这是一颗定时炸弹,随时可能要你的命。

2.尽量使用URI形式的绝对路径资源。它可以很容易的转变为URI,URL,File对象。

3.尽量使用相对classpath的相对路径。不要使用绝对路径。使用上面ClassLoaderUtil类的public static URL getExtendResource(String relativePath)方法已经能够使用相对于classpath的相对路径定位所有位置的资源。

4.绝对不要使用硬编码的绝对路径。因为,我们完全可以使用ClassLoader类的getResource("")方法得到当前classpath的绝对路径。如果你一定要指定一个绝对路径,那么使用配置文件,也比硬编码要好得多!

获得CLASSPATH之外路径的方法:
URL base = this.getClass().getResource(""); //先获得本类的所在位置,如/home/popeye/testjava/build/classes/net/
      String path = new File(base.getFile(), "....../....../....../"+name).getCanonicalPath(); //就可以得到/home/popeye/testjava/name

另外,如果从ANT启动程序,this.getClass().getResource("")取出来的比较怪,直接用JAVA命令行调试就可成功。

Original: https://www.cnblogs.com/mark5/p/15593564.html
Author: 双间
Title: JAVA获取文件的路径方法(获取classpath路径)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538155/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • centos安装配置rabbitmq

    (1)安装erlangrpm -ivh erlang-20.3.8.26-1.el7.x86_64.rpm (2)安装socatrpm -ivh socat-1.7.3.2-2.e…

    Java 2023年5月29日
    072
  • 深入源码理解SpringBean生命周期

    概述 本文描述下Spring的实例化、初始化、销毁,整个SpringBean生命周期,聊一聊BeanPostProcessor的回调时机、Aware方法的回调时机、初始化方法的回调…

    Java 2023年6月6日
    085
  • 泛型

    1.给泛型指向数据类型要求是 引用类型,不能是基本数据类型 2.在给泛型指定具体类型后,可以传入该类型或者其子类类型 3.泛型的写法 ​ 常规写法:HashSet set = ne…

    Java 2023年6月5日
    0121
  • 戏说领域驱动设计(二十)——值对象

    值对象这个东西在DDD里算是比较抽象的,好多人学了半天也学不明白。我这种聪明人也费了好大劲,总算苦心人天不负,现在也能用个有模有样了。战术模式中不论是领域服务、对象工厂还是资源库,…

    Java 2023年6月7日
    071
  • java本地缓存

    由于服务器、数据库、网络等资源有限,无法支撑越来越多的请求与计算量,所以将一部分数据放在缓存中,以此减小薄弱环节的计算量和请求流程。 网站中缓存的应用场景:1:可以缓存整个页面的h…

    Java 2023年6月15日
    086
  • Java 基础【18】 反射与内省

    Java 反射机制(Reflect)容许程序在运行时加载、探知、使用编译期间完全未知的 class,核心类 java.lang.Class。 通过把指定类中各种元素映射成 java…

    Java 2023年5月29日
    056
  • Mybatis学习笔记

    MyBatis 框架 MyBatis 框架 前言 第一章 框架的概述 1.三层架构 2. 三层架构请求的处理流程 3. 为什么要使用三层? 4. 三层架构模式和框架 5 .框架 6…

    Java 2023年6月5日
    059
  • Redis学习

    1.1 下载安装 环境Centos7.x https://redis.io/download 安装make(可选) yum -y install make 安装gcc(可选) yu…

    Java 2023年6月5日
    068
  • nodejs解压版安装和配置(带有搭建前端项目脚手架)

    nodejs 安装 我先前用了nvm,觉得nvm挺厉害可以随时更换nodejs版本,但是研究了下,可能自己功力不够还是什么,并不好用,中间还出现了错误;所以最后还是卸载了; 本文图…

    Java 2023年6月16日
    067
  • 期末代码

    使用Java的输入输出流将一个文本文件的内容按行读出,每读出一行,就顺序添加行号,并写入到另一个文件中。 import java.io.*; public class E { pu…

    Java 2023年6月9日
    083
  • hdfs常用shell命令

    1、创建文件夹 hadoop fs -mkdir [-p] … path 为待创建的目录 -p选项的行为与Unix mkdir -p非常相似,它会沿着路径创建父目录。 …

    Java 2023年6月5日
    083
  • SpringSecurity+Token实现权限校验

    1.Spring Security简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spr…

    Java 2023年6月9日
    065
  • 【leetcode】239. 滑动窗口最大值

    题目 题解 三种解法 “单调队列”解法 新增、获取最大值 删除 代码 题目 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组…

    Java 2023年6月6日
    075
  • -2020年度钻石C++C(2)《博学谷》

    -2020年度钻石C++C(2)《博学谷》 第一类:数据类型关键字 void 声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果。 char 字符型类型数据,属于整型数据的…

    Java 2023年6月7日
    0113
  • 再谈MySql索引

    一、索引简介 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 索引分单列索引(主键索引、唯一索引、普通索引)和组合索引。单列索引,即…

    Java 2023年6月5日
    077
  • 关于java中使用split方法末尾空值被丢弃的问题

    嗯… 在最近的一次项目中,使用split方法分割字符串后得到的数组与预期不符。 查找原因后发现,使用默认的split方法时,会默认丢弃字符串末尾的空值,而字符串中间的空…

    Java 2023年5月29日
    080
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球