java 檔案路徑
Java路徑
可以嘗試使用如下列印來尋找你要的路徑:
System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));
System.out.println(Thread.currentThread().getContextClassLoader().getResource("/"));
System.out.println(FileTest.class.getClassLoader().getResource(""));
System.out.println(FileTest.class.getClassLoader().getResource("/ "));
System.out.println(ClassLoader.getSystemResource(""));
System.out.println(FileTest.class.getResource("")); 加上檔名,可以取得包下的配置檔案的路徑.
System.out.println(FileTest.class.getResource("/"));//Class檔案所在路徑
System.out.println(newFile("/").getAbsolutePath());
System.out.println(System.getProperty("user.dir"));
Java中使用的路徑,分為兩種:絕對路徑和相對路徑。具體而言,又分為四種:
一、URI形式的絕對資源路徑
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b
URL是URI的特例。URL的字首/協議,必須是Java熟悉的。URL可以開啟資源,而URI則不行。
URL和URI物件可以互相轉換,使用各自的toURI(),toURL()方法即可!
二、本地系統的絕對路徑
D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b
Java.io包中的類,需要使用這種形式的引數。
但是,它們一般也提供了URI型別的引數,而URI型別的引數,接受的是URI樣式的String。因此,通過URI轉換,還是可以把URI樣式的絕對路徑用在java.io包中的類中。
三、相對於classpath的相對路徑
如:相對於
file:/D:/java/eclipse32/workspace/jbpmtest3/bin/這個路徑的相對路徑。其中,bin是本專案的classpath。所有的Java原始檔編譯後的.class檔案複製到這個目錄中。
四、相對於當前使用者目錄的相對路徑
就是相對於System.getProperty("user.dir")返回的路徑。
對於一般專案,這是專案的根路徑。對於JavaEE伺服器,這可能是伺服器的某個路徑。這個並沒有統一的規範!
所以,絕對不要使用"相對於當前使用者目錄的相對路徑"。然而:
預設情況下,java.io 包中的類總是根據當前使用者目錄來分析相對路徑名。此目錄由系統屬性 user.dir 指定,通常是 Java 虛擬機器的呼叫目錄。
這就是說,在使用java.io包中的類時,最好不要使用相對路徑。否則,雖然在J2SE應用程式中可能還算正常,但是到了J2EE程式中,一定會出問題!而且這個路徑,在不同的伺服器中都是不同的!
相對路徑最佳實踐
推薦使用相對於當前classpath的相對路徑
因此,我們在使用相對路徑時,應當使用相對於當前classpath的相對路徑。
ClassLoader類的getResource(String name),getResourceAsStream(String name)等方法,使用相對於當前專案的classpath的相對路徑來查詢資源。
讀取屬性檔案常用到的ResourceBundle類的getBundle(String path)也是如此。
通過檢視ClassLoader類及其相關類的原始碼,我發現,它實際上還是使用了URI形式的絕對路徑。通過得到當前classpath的 URI形式的絕對路徑,構建了相對路徑的URI形式的絕對路徑。(這個實際上是猜想,因為JDK內部呼叫了SUN的原始碼,而這些程式碼不屬於JDK,不是開源的。) 相對路徑本質上還是絕對路徑
因此,歸根結底,Java本質上只能使用絕對路徑來尋找資源。所有的相對路徑尋找資源的方法,都不過是一些便利方法。不過是API在底層幫助我們構建了絕對路徑,從而找到資源的!
得到classpath和當前類的絕對路徑的一些方法
下面是一些得到classpath和當前類的絕對路徑的一些方法。你可能需要使用其中的一些方法來得到你需要的資源的絕對路徑。
1.FileTest.class.getResource("")
得到的是當前類FileTest.class檔案的URI目錄。不包括自己!
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/
2.FileTest.class.getResource("/")
得到的是當前的classpath的絕對URI路徑。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
3.Thread.currentThread().getContextClassLoader().getResource("")
得到的也是當前ClassPath的絕對URI路徑。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
4.FileTest.class.getClassLoader().getResource("")
得到的也是當前ClassPath的絕對URI路徑。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
5.ClassLoader.getSystemResource("")
得到的也是當前ClassPath的絕對URI路徑。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
我推薦使用Thread.currentThread().getContextClassLoader().getResource("")來得到當前的classpath的絕對路徑的URI表示法。
Web應用程式中資源的定址
上文中說過,當前使用者目錄,即相對於System.getProperty("user.dir")返回的路徑。
對於JavaEE伺服器,這可能是伺服器的某個路徑,這個並沒有統一的規範!
而不是我們釋出的Web應用程式的根目錄!
這樣,在Web應用程式中,我們絕對不能使用相對於當前使用者目錄的相對路徑。
在Web應用程式中,我們一般通過ServletContext.getRealPath("/")方法得到Web應用程式的根目錄的絕對路徑。
這樣,我們只需要提供相對於Web應用程式根目錄的路徑,就可以構建出定位資源的絕對路徑。
這是我們開發Web應用程式時一般所採取的策略。
推薦使用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");
總結一下:
web 上執行
1:
this.getClass().getClassLoader().getResource("/").getPath();
this.getClass().getClassLoader().getResource("").getPath(); 得到的是 ClassPath的絕對URI路徑。
如:/D:/jboss-4.2.2.GA/server/default/deploy/hp.war/WEB-INF/classes/
System.getProperty("user.dir");
this.getClass().getClassLoader().getResource(".").getPath(); 得到的是 專案的絕對路徑。
如:/D:/jboss-4.2.2.GA/server/default/deploy/hp.war
2:
this.getClass().getResource("/").getPath();
this.getClass().getResource("").getPath(); 得到的是當前類 檔案的URI目錄。不包括自己!
如:/D:/jboss-4.2.2.GA/server/default/deploy/hp.war/WEB-INF/classes/com/jebel/helper/
this.getClass().getResource(".").getPath(); X 不 能執行
3:
Thread.currentThread().getContextClassLoader().getResource("/").getPath()
Thread.currentThread().getContextClassLoader().getResource("").getPath() 得到的是 ClassPath的絕對URI路徑。
如:/D:/jboss-4.2.2.GA/server/default/deploy/hp.war/WEB-INF/classes/
Thread.currentThread().getContextClassLoader().getResource(".").getPath() 得到的是 專案的絕對路徑。
如:/D:/jboss-4.2.2.GA/server/default/deploy/hp.war
在本地執行中
1:
this.getClass().getClassLoader().getResource("").getPath();
this.getClass().getClassLoader().getResource(".").getPath(); 得到的是 ClassPath的絕對URI路徑。
如:/D:/myProjects/hp/WebRoot/WEB-INF/classes
this.getClass().getClassLoader().getResource(".").getPath(); X 不 能執行
2:
this.getClass().getResource("").getPath();
this.getClass().getResource(".").getPath(); 得到的是當前類 檔案的URI目錄。不包括自己!
如:/D:/myProjects/hp/WebRoot/WEB-INF/classes/com/jebel/helper/
/D:/myProjects/hp/WebRoot/WEB-INF/classes/ 得到的是 ClassPath的絕對URI路徑。
如:/D:/myProjects/hp/WebRoot/WEB-INF/classes
3:
Thread.currentThread().getContextClassLoader().getResource(".").getPath()
Thread.currentThread().getContextClassLoader().getResource("").getPath() 得到的是 ClassPath的絕對URI路徑。。
如:/D:/myProjects/hp/WebRoot/WEB-INF/classes
Thread.currentThread().getContextClassLoader().getResource("/").getPath() X 不 能執行
最後
在Web應用程式中,我們一般通過ServletContext.getRealPath("/")方法得到Web應用程式的根目錄的絕對路徑。
還有request.getContextPath(); 在Weblogic中要用request.getServletContext().getContextPath();但如果打包成war部署到Weblogic伺服器,專案內部並沒有檔案結構的概念,用這種方式是始終得到null,獲取不到路徑,目前還沒有找到具體的解決方案
-------------------------------------------
Servlet中獲得當前應用的相對路徑和絕對路徑
根目錄所對應的絕對路徑:request.getServletPath();
檔案的絕對路徑:request.getSession().getServletContext().getRealPath();
當前web應用的絕對路徑:servletConfig.getServletContext().getRealPath("/");
ServletContext物件獲得幾種方式:
javax.servlet.http.HttpSession.getServletContext()
javax.servlet.jsp.PageContext.getServletContext()
javax.servlet.ServletConfig.getServletContext()
相關推薦
java檔案路徑問題及Eclipse package,source folder,folder區別及相互轉換
eclipse下,建立一個source folder(我建立的是folder,),名稱為resource,呼叫時 為 "resource/bg.gif" ; //注意resource前面沒有 /" 有/則錯誤 eclipse的相對路徑起始位置位於當前包的根目錄,system.g
獲取java檔案路徑
1.如何獲得當前檔案路徑 常用: 字串型別:System.getProperty("user.dir"); 綜合: package com.zcjl.test.base; import java.io.File; public class Test { public
java 檔案路徑
Java路徑 可以嘗試使用如下列印來尋找你要的路徑: System.out.println(Thread.currentThread().getContextClassLoader().getResource("")); System.o
java檔案路徑獲取方式
1.獲取當前專案路徑 String address1 = System.getProperty("user.dir"); System.out.println(address1); //輸出結果為:F:\javaRuning\workspace\superclub,supe
Java 檔案路徑的不同寫法
在Java中, File file = New File("E://test.txt")、 File file = New File("E:\\test.txt")、 File file = New File("E:/test.txt")都可以達到目的,但是這三種寫法有沒有
Java——檔案路徑操作
import java.io.*; import java.util.Date; import java.text.SimpleDateFormat; class test{ public st
java使用poi把從資料庫中取出的資料寫入到excel檔案中並儲存到指定檔案路徑
有時候我們要把從資料庫中取出的資料匯入到excel中,使取到的資料看起來更加的直觀和方便,在java中如何實現取到的資料匯入到excel中呢?以下就是使用poi工具吧資料寫入excel檔案中的解決方法: Excel表格副檔名有.xlsx和.xls兩種格式 &n
Java讀取resource檔案/路徑的幾種方式
方式一: String fileName = this.getClass().getClassLoader().getResource("檔名").getPath();//獲取檔案路徑 String fileUtl = this.getClass().getResource("檔名").getFi
java通過檔案路徑讀取該路徑下的所有檔案並將其放入list中
需求:所有xml檔案都放在某個目錄下,寫個方法讀取所有xml檔案,然後傳給下面的某個方法呼叫 實現:先把所有的xml檔案通過遞迴讀取出來 ,存放到List中,然後以檔名為Key,檔案(檔案路徑+檔名)為Value,存放到Map中,供後面程式呼叫 程式碼如下: import java.io.File
[LINUX]CentOS7檢視Java檔案安裝路徑
使用echo檢視檔案位置的話,前提是配置安裝了環境變數java_home,否則是找不到的檔案路徑位置的 [root@Redhat6 bin]# echo $JAVA_HOME [root@Redhat
Java中“/”,“.”所代表的檔案路徑
我們在開發的過程中,經常會去讀、寫檔案。在讀寫檔案的時候,就不得不寫檔案的路徑,使用相對路徑的方式有兩種:”/”和 “.” 。在寫檔案的路徑的時候,需要了解一下幾點東西: 在java應用程式中,“.”代表的是執行class檔案時的目錄,而“/”代表的是磁碟分割槽的根
Java遞迴讀取檔案路徑下所有檔名稱並儲存為Txt文件
本文用遞迴的方法實現讀取一個路徑下面的所有檔案並將檔名稱儲存到Txt檔案中,親測可用。 遞迴讀取檔案路徑下的所有檔案: /** * 遞迴讀取檔案路徑下的所有檔案 * * @param path * @param fileNameList
Java 尋找一個目下的所有“.Java”檔案,並將他們的絕對路徑存到一個文字檔案中
import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.FilenameFilter; import java.io.IOExce
Java從檔案路徑中獲取檔名的幾種方法
Java從檔案路徑中獲取檔名的幾種方法 舉例:String fName =” G:\Java_Source\navigation_tigra_menu\demo1\img\lev1_arrow.gif ” 方法一: ? View Code
Java獲取當前專案檔案路徑
1.獲取當前專案的實際路徑 String path = System.getProperty("user.dir"); 執行結果: 實際專案路徑: 2.獲取專案配置檔案資訊(application.yml) InputStream
Java學習筆記11-- Junit單元測試 ;BeanUtils ;檔案路徑
∆ Junit單元測試 1.1. Junit單元測試框架的基本使用 一、搭建環境: 匯入junit.jar包(junit4) 二、寫測試類: 0,一般一個類對應一個測試類。 1,測試類與被測試類最好是放到同一個包中(可以是不同的原始檔夾) 2,測試類的名字為
java獲取專案中檔案路徑
public String getCurrentPath(){ //取得根目錄路徑 String rootPath=getClass().getResource("/").getFile
Java web專案如何獲取某個資料夾下面的檔案路徑 絕對路徑 ?
/** * @param relativePath : 相對classpath路徑 */ public static File getAbsoluteFileInWebContainer(String relativePath
java判斷路徑是資料夾還是檔案
當給定一個路徑沒有後綴的時候,很難分辨程式碼是檔案還是資料夾,如下圖: 我在桌面建立了一個名為one的檔案,路徑為:/Users/XXXXXX/Desktop/one java程式碼如下: import java.io.File; public class Flie_or_Folder {
關於java獲取檔案路徑的幾種方式
第一種: File f = new File(this.getClass().getResource("/").getPath()); System.out.println(f); 結果: C:\Documents%20and%20Settings\Administ