Java或者JAR包获取读取资源文件的路径的问题总结

简介:
这里分为具体两种: 

第一种:资源文件为一般后缀文件 

第二种:资源文件为图片文件 

【NO1】第一种 

  使用这行代码可以获取class类的根目录的路径 

  String path =Thread.currentThread().getContextClassLoader().getResource("").getPath(); 

例子:我用的开发软件MyEclipse 6.5 

假设项目文件夹如下: 

   files———bin——core(生成class包) 

       |               |         |——Main.class(生成的class文件) 

       |               | 

       |               |——resource( 生成资源文件夹) 

       |                         |——a.bat 

       |                         |——b.png 

       |———src——core(源包)  

                   |             |—— Main.java(源代码) 

                   | 

                   |——resource(源资源文件夹)  

                                 |——a.bat 

                                 |——b.png 

//源代码Main.java 

//============================================================ 

package core; 
import java.io.File; 

public class Main { 


    public static void main(String[] args){ 
        try{ 
        String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();    //添加 
        File af=new File(path+"/resource"); 
        if(!af.exists()) System.out.println("nullEXIST");; 
        String[] files =af.list(); 
        if(files.length==0) System.out.println("nullLENGTH");; 
        for(int i=0;i<files.length;i++){ 
            if(files[i]!=null)System.out.println(files[i]); 
            else System.out.println("null"); 
        } 
        
        } 
        catch(Exception e){ 
            System.out.println("HugeERROR"); 
        } 
    } 
        


// =============================================================== 

    运行结果: 

a.bat 

b.png   

就对了   

【NO2】第二种 

建议使用下面( 2 )方法,因为(1)jar之后可能出现找不到的问题 (之前我试过出现这种情况) 

这里代码省了 

(1)、你将所有资源打包为epm.jar,你的类位于一个包中:package core;你的图片资源全部放在images文件夹中,而images文件夹也位于core包内。这样的话,最终的路径表现为: 
epm———bin——core(生成class包) 

       |               |         |——Main.class(生成的class文件) 

       |               | 

       |               |——images( 生成资源文件夹) 

       |                         |——system.bat 

       |                         |——background.png 

       |———src——core(源包)  

                   |             |—— Main.java(源代码) 

                   | 

                   |——images(源资源文件夹)  

                                 |——system.bat 

                                 |——background.png 




  可以通过相对路径来访问:        

  java.net.URL imUrl = getClass().getResource("images/background.png"); 
  ImageIcon im = new ImageIcon(imUrl); 

(2)、另一种情况,如果你的类有很多,并且包的结构很复杂,应该把图片放到最外层,让所有的类通过绝对路径来访问该图片 

epm———bin——core(生成class包) 

       |               |         |——Main.class(生成的class文件) 

       |               | 

       |               |——images( 生成资源文件夹) 

       |                         |——system.bat 

       |                         |——background.png 

       |———src——core(源包)  

                   |             |—— Main.java(源代码) 

                   | 

                   |——images(源资源文件夹)  

                                 |——system.bat 

                                 |——background.png 


java.net.URL imUrl = getClass().getResource("/images/background.png"); 
ImageIcon im = new ImageIcon(imgUrl); 

区别非常细微,仅仅是在“images”的前面加了一个反斜杠"/",这个反斜杠就表示根目录,没有反斜杠就表示相对路径。 


Java中获取资源文件

新建一个Java工程,新建一个constants.properties资源文件

Java代码   收藏代码
  1. userName = snail  
  2. age = 24  
  3. password = 123456  

然后我们再建立一个类Constans.java,附上静态变量

Java代码   收藏代码
  1. package testproperties;  
  2.   
  3. public  class Constants {  
  4.   
  5.     public static String userName;  
  6.     public static int age;  
  7.     public static String password;   
  8. }  

接下来的工作就尝试着如何获取properties文件类定义的姓名、年龄和密码了,新建一个InitProperties类

package testproperties;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class InitProperties {
	  private static final long serialVersionUID = -2106230733190196852L;

	  public void init()
	  {
	    System.out.println("#############################加载配置信息###########################");
	    Properties prop = new Properties();

	    //得到的是编译后的bin的目录Class.class.getClass().getResource("/").getPath();
	    
	    //这个是绝对路径
//	    String filepath = "E:\\myeclipse6\\workspace\\XXX\\src\\testproperties\\constants.properties";
	    
	    String filepath = Class.class.getClass().getResource("/").getPath()+"/testproperties/constants.properties" ;
	  
	    System.out.println("++++++++++++"+Class.class.getClass().getResource("/").getPath()+"+++++++++++++");
	    
	    FileInputStream fis = null;
	    try {
	      fis = new FileInputStream(filepath);
	      prop.load(fis);
	      Constants.userName = prop.getProperty("userName");
	      Constants.age = Integer.parseInt(prop.getProperty("age"));
	      Constants.password = prop.getProperty("password");
	      System.out.println(Constants.userName+Constants.age+Constants.password);;
	      System.out.println("#############################加载配置信息完成###########################");
	    }
	    catch (IOException e) {
	      System.out.println("加载constants.properties文件失败,文件不存在后者路径不正确! ");
	      e.printStackTrace();
	    }
	  }
	  public static void main(String[] args) {
		  InitProperties ip = new InitProperties();
		  ip.init();
	}
}

现在附上集中在jsp、Java、和servlet中获取路径的方法:(引用自http://zhidao.baidu.com/question/86179810.html?fr=qrl&cid=93&index=5

1.jsp中取得路径:

以工程名为TEST为例:

(1)得到包含工程名的当前页面全路径:request.getRequestURI() 
    结果:/TEST/test.jsp 
(2)得到工程名:request.getContextPath() 
    结果:/TEST 
(3)得到当前页面所在目录下全名称:request.getServletPath() 
    结果:如果页面在jsp目录下 /TEST/jsp/test.jsp 
(4)得到页面所在服务器的全路径:application.getRealPath("页面.jsp") 
    结果:D:\resin\webapps\TEST\test.jsp 
(5)得到页面所在服务器的绝对路径:absPath=new java.io.File(application.getRealPath(request.getRequestURI())).getParent(); 
    结果:D:\resin\webapps\TEST

 

2.在类中取得路径:

(1)类的绝对路径:Class.class.getClass().getResource("/").getPath() 
    结果:D:/TEST/WebRoot/WEB-INF/classes/pack/ 
(2)得到工程的路径:System.getProperty("user.dir") 
    结果:D:\TEST

 

3.在Servlet中取得路径:

(1)得到工程目录:request.getSession().getServletContext().getRealPath("") 参数可具体到包名。 
    结果:E:\Tomcat\webapps\TEST 
(2)得到IE地址栏地址:request.getRequestURL() 
    结果:http://localhost:8080/TEST/test 
(3)得到相对地址:request.getRequestURI() 
    结果:/TEST/test


相关文章
|
3月前
|
安全 Java API
JAVA并发编程JUC包之CAS原理
在JDK 1.5之后,Java API引入了`java.util.concurrent`包(简称JUC包),提供了多种并发工具类,如原子类`AtomicXX`、线程池`Executors`、信号量`Semaphore`、阻塞队列等。这些工具类简化了并发编程的复杂度。原子类`Atomic`尤其重要,它提供了线程安全的变量更新方法,支持整型、长整型、布尔型、数组及对象属性的原子修改。结合`volatile`关键字,可以实现多线程环境下共享变量的安全修改。
|
4月前
|
Java 中间件 测试技术
java依赖冲突解决问题之jar包版本冲突无法通过升降级解决时如何解决
java依赖冲突解决问题之jar包版本冲突无法通过升降级解决时如何解决
|
4月前
|
Java Linux Maven
java依赖冲突解决问题之容器加载依赖jar包如何解决
java依赖冲突解决问题之容器加载依赖jar包如何解决
|
4月前
|
Java Maven 容器
java依赖冲突解决问题之Maven在编译打包过程中对依赖的jar包如何解决
java依赖冲突解决问题之Maven在编译打包过程中对依赖的jar包如何解决
|
1月前
|
数据采集 分布式计算 Java
Kettle的Java开发环境需要什么jar包?
【10月更文挑战第24天】Kettle的Java开发环境需要什么jar包?
79 2
|
2月前
|
IDE Java 编译器
Java:如何确定编译和运行时类路径是否一致
类路径(Classpath)是JVM用于查找类文件的路径列表,对编译和运行Java程序至关重要。编译时通过`javac -classpath`指定,运行时通过`java -classpath`指定。IDE如Eclipse和IntelliJ IDEA也提供界面管理类路径。确保编译和运行时类路径一致,特别是外部库和项目内部类的路径设置。
|
2月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
58 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
2月前
|
Java Apache Maven
Java/Spring项目的包开头为什么是com?
本文介绍了 Maven 项目的初始结构,并详细解释了 Java 包命名惯例中的域名反转规则。通过域名反转(如 `com.example`),可以确保包名的唯一性,避免命名冲突,提高代码的可读性和逻辑分层。文章还讨论了域名反转的好处,包括避免命名冲突、全球唯一性、提高代码可读性和逻辑分层。最后,作者提出了一个关于包名的问题,引发读者思考。
Java/Spring项目的包开头为什么是com?
|
3月前
|
Java API 数据处理
Java 包(package)的作用详解
在 Java 中,包(package)用于组织和管理类与接口,具有多项关键作用:1)系统化组织代码,便于理解和维护;2)提供命名空间,避免类名冲突;3)支持访问控制,如 public、protected、默认和 private,增强封装性;4)提升代码可维护性,实现模块化开发;5)简化导入机制,使代码更简洁;6)促进模块化编程,提高代码重用率;7)管理第三方库,避免命名冲突;8)支持 API 设计,便于功能调用;9)配合自动化构建工具,优化项目管理;10)促进团队协作,明确模块归属。合理运用包能显著提升代码质量和开发效率。
|
3月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
54 4