閱讀847 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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中獲取路徑的方法:(引用自https://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() 
    結果:https://localhost:8080/TEST/test 
(3)得到相對地址:request.getRequestURI() 
    結果:/TEST/test


最後更新:2017-04-03 14:54:29

  上一篇:go 技術人員談管理之項目風險規避
  下一篇:go Apache關閉目錄瀏覽