1. java中用父路徑和子路徑創建file對象有什麼用呢
是相對路徑和絕對路徑的問題
在Java中用File對象來創建文件時,絕對路徑一般是不會出現什麼問題的,如果使用相對路徑,則有可能出現意向不到的問題,以下主要是針對相對路徑進行解釋
1、Eclipse下的Java Project環境
目錄結構如下所示:
JavaTest
src
com.ccse.TestDemo.java
resource
text.txt
String filepath = "resource/train.txt";
File file = new File(filepath);
注意:filepath變數的內容
在此,java.io默認情況下用當前目錄來分析相對路徑名,定位到當前用戶目錄下("user.dir"),即工程目錄d:\JavaTest下,因此此時的相對路徑(以當前用戶目錄為基礎)為"resource/train.txt",這樣JVM就根據用戶當前目錄(user.dir) 和"resource/train.txt"得到完整路徑,即絕對路徑,從而找到相應的文件,需要注意的是相對路徑的起始處無斜杠「/」,比如上面的filepath。
2. 還沒搞懂Java中的路徑看完這篇文章你就全懂了
之前對於Java中的路徑一直感到模糊不清,雖然知道一些,但實際操作時還是會遇到很多問題。每次遇到FileNotFound錯誤時,都會去搜索解決方案,比如相對路徑是從哪裡開始的,如何使用某個方法等。其實這就是一種盲目的編程方式。這次我決心一次性搞懂Java中的路徑問題,以便在未來的編程中更加得心應手。
「絕對路徑:」絕對路徑的英文全稱是Absolute Path,指的是真實的路徑,是計算機中的完整路徑,必須准確無誤。它以系統的根目錄為起點,即各個盤符。
「相對路徑:」相對路徑是相對於目標文件位置的路徑。但相對路徑的相對性很重要,它可以是項目的根目錄或classpath目錄。下面通過一個例子來說明絕對路徑和相對路徑的區別。
假設JavaIO模塊下的resource目錄下的a.txt文件,它的絕對路徑和相對路徑如下:
「絕對路徑:」D:\code\River\JavaSE\javaIO\src\main\resources\a.txt
「相對路徑:」相對於項目的根路徑是:classpath(也就是「target/classes」)
在project中,相對路徑的根目錄是project的根文件夾。創建文件的寫法如下:
「相對路徑:」D:\code\River\JavaSE(也就是工程的相對路徑),注意路徑不能以"/"開頭
「絕對路徑:」
在Java開發中,我們經常需要獲取文件內容。通常使用File類來獲取,例如:獲取「c:\文件.txt」時,我們需要創建一個File對象:File file = new File("c:\文件.txt")。然後使用file類創建一個文件輸入流:FileInputStream in = new FileInputStream(file),再使用該輸入流進行操作。但這樣有一個缺點,就是文件路徑是硬編碼的形式,在Java編碼過程中我們不推薦這種寫法。
當然,在web項目中,我們可以通過application對象的getRealPath(「文件名」)方式獲取文件的絕對路徑,但這也不是很推薦。因此,我們可以使用class.getResource(path)和class.getClassLoader(path)方法來獲取文件資源。下面我們來研究一下兩者的區別:
4.1 class.getResource(path)
其中的參數path有兩種形式,一種是以「/」開頭的,另一種是不以"/"開頭。
輸出的結果為:
假設現在的項目結構如下所示,針對下面的三種情況如何獲取:
獲取上圖所示的三種文件的方法:
輸出的結果為:
class.getResource()和class.getResourceAsStream()方式的使用在路徑上是一致的。
4.2 Class.getClassLoader().getResource(String path)
該方法中的參數path不能以「/」開頭,path表示的是從classpath下獲取資源的。
輸出結果:
五、總結
3. java中獲取文件路徑的幾種方式
File的getPath方法得到相對路徑 getAbsolutePath方法得到絕對路徑
舉個例子
String fileName = "yourfile.txt";
File aFile = new File(fileName);//這里可以把路徑拼在fileName前面 可以用相對路徑 也可以用絕對 注意分隔符
System.out.println(aFile.getPath()); //相對路徑
System.out.println(aFile.getAbsolutePath()); //絕對路徑
具體的東西在這里 http://teamojiao.iteye.com/blog/446615
4. java里絕對路徑和相對路徑的區別
按照jdk Doc上的說法」絕對路徑名是完整的路徑名,不需要任何其他信息就可以定位自身表示的文件。相反,相對路徑名必須使用來自其他路徑名的信息進行解釋。默認情況下,java.io 包中的類總是根據當前用戶目錄來分析相對路徑名。此目錄由系統屬性 user.dir 指定,通常是 Java 虛擬機的調用目錄.」
相對路徑顧名思義,相對於某個路徑,那麼究竟相對於什麼路徑我們必須弄明白.按照上面jdk文檔上講的這個路徑是」當前用戶目錄」也就是」java虛擬機的調用目錄」.更明白的說這個路徑其實是我們在哪裡調用jvm的路徑.舉個例子:
假設有一java源文件Example.java在d盤根目錄下,該文件不含package信息.我們進入命令行窗口,然後使用」d:」命令切換到d盤根目錄下,然後用」javac Example.java」來編譯此文件,編譯無錯後,會在d盤根目錄下自動生成」Example.class」文件.我們在調用」java Example」來運行該程序.此時我們已經啟動了一個jvm,這個jvm是在d盤根目錄下被啟動的,所以此jvm所載入的程序中File類的相對路徑也就是相對這個路徑的,即d盤根目錄:D:/.同時」 當前用戶目錄」也是D:/.在System.getProperty(「user.dir」);系統變數」user.dir」存放的也是這個值.
我們可以多做幾次試驗,把」Example.class」移動到不同路徑下,同時在那些路徑下,執行」java Example」命令啟動jvm,我們會發現這個」當前用戶目錄」是不斷變化的,它的路徑始終和我們在哪啟動jvm的路徑是一致的.
搞清了這些,我們可以使用相對路徑來創建文件,例如:
File file = new File(「a.txt」);
File.createNewFile();
假設jvm是在」D:/」下啟動的,那麼a.txt就會生成在D:/a.txt;
此外,這個參數還可以使用一些常用的路徑表示方法,例如」.」或」./」代表當前目錄,這個目錄也就是jvm啟動路徑.所以如下代碼能得到當前目錄完整路徑:
File f = new File(「.」);
String absolutePath = f.getAbsolutePath();
System.out.println(absolutePath);//D:/
最後要說說在eclipse中的情況:
Eclipse中啟動jvm都是在項目根路徑上啟動的.比如有個項目名為blog,其完整路徑為:D:/work/IDE/workspace/blog.那麼這個路徑就是jvm的啟動路徑了.所以以上代碼如果在eclipse里運行,則輸出結果為」 D:/work/IDE/workspace/blog.」
Tomcat中的情況.
如果在tomcat中運行web應用,此時,如果我們在某個類中使用如下代碼:
File f = new File(「.」);
String absolutePath = f.getAbsolutePath();
System.out.println(absolutePath);
那麼輸出的將是tomcat下的bin目錄.我的機器就是」 D:/work/server/jakarta-tomcat-5.0.28/bin/.」,由此可以看出tomcat伺服器是在bin目錄下啟動jvm的.其實是在bin目錄下的」 catalina.bat」文件中啟動jvm的.