2011-03-11 66 views
0


我在父目錄的一個訪問文件的這個問題上創建文件的文件對象。
爲了解釋,考慮下面的目錄結構: -從父目錄在java中

C:/Workspace/Appl/src/org/abc/bm/TestFile.xml 
C:/Workspace/Appl/src/org/abc/bm/tests/CheckTest.java 

在CheckTest.java我要爲TestFile.xml

public class Check { 
    public void checkMethod() { 
     File f = new File({filePath value I want to determine}, "TestFile.xml"); 
    } 
} 

創建一個文件比如我嘗試了一些事情getAbsolutePath()getParent()等,但變得有點複雜,坦率地說,我想我搞砸了。
我之所以不想在創建File實例使用"C:/Workspace/Appl/src/org/abc/bm"是因爲C:/Workspace/Appl不是固定的,在所有的情況下會在運行時不同,基本上我不想硬編碼。
什麼可能是最容易和更乾淨的方式來實現這一目標?

謝謝。

回答

3

你應該從類路徑加載它在這種情況下。

在你CheckTest.java,嘗試

FileInputStream fileIs = new FileInputStream(CheckTest.class.getClassLoader().getResourceAsStream("org/abc/bm/TestFile.xml"); 
+0

@Andrew Thompson @Nishan - 我現在已經嘗試了這兩個,他們的工作。使用任何一種方式的特定優勢/劣勢? – 2011-03-11 11:07:17

+0

這些都依賴於一個基本原則 - 從classpath加載。所以,它們中的任何一個都應該對你有用,而不是直接從硬編碼文件路徑加載。 – adarshr 2011-03-11 11:09:30

+0

但是,如果您只想讀取文件,則無需首先創建File對象。請使用我已經指出的FileInputStream方法。 – adarshr 2011-03-11 11:10:25

-2

你嘗試

URL some=Test.class.getClass().getClassLoader().getResource("org/abc/bm/TestFile.xml"); 
File file = new File(some.getFile()); 
+0

這將失敗,因爲getFile只返回文件的名稱,而不是File對象本身 – 2011-03-11 11:02:04

+1

如果您執行Test.class.getClass()。getclassLoader(),您將得到java.lang的類加載器.Class對象,而不是Test的。 – adarshr 2011-03-11 11:11:45

+0

早先忘了提到,我用'this.getClass()'試過這種方式,它是如何工作的。 – 2011-03-11 11:19:54

1

應該使用System.getProperty得到基本目錄或您在應用程序啓動設置base.dir

java -Dbase.dir=c:\User\pkg 

System.getProperty("base.dir"); 

,並使用

System.getProperty("file.separator"); 
1

什麼能實現這一目標的最簡單和乾淨的方式?

對於訪問靜態資源的使用:

URL urlToResource = this.getClasS().getResource("path/to/the.resource"); 

如果該資源預期發生變化,它寫的user.home的子目錄,它是便於以後查找。

0

首先,你不能去上運行的源文件路徑的參考。

但是,您可以訪問包含在類路徑中resrources(你遵守.class文件會)。

通常情況下,你的編譯器將複製的XML文件包含在你的srouce目錄到構建目錄,所以在最後,你可能最終有這樣的事情:

C:/Workspace/Appl/classes/org/abc/bm/TestFile.xml 
C:/Workspace/Appl/classes/org/abc/bm/tests/CheckTest.class 

然後,用你的類路徑指向編譯的類根目錄,您可以使用ClassLoader.getResource方法(或等效的Class.getResource()方法)從此目錄獲取資源。

public class Check { 
    public void checkMethod() { 
     java.net.URL fileURL=this.getClass().getResource("/org/abc/bm/tests/TestFile.xml"); 

     File f=new File(fileURL.toURI()); 

    } 
} 
0

一個可以這樣做:

String pathOfTheCurrentClass = this.getClass().getResource(".").getPath();   
File file = new File(pathOfTheCurrentClass + "/..", "Testfile.xml"); 

String pathOfTheCurrentClass = this.getClass().getResource(".").getPath(); 
File filePath = new File(pathOfTheCurrentClass); 
File file = new File(filePath.getParent(), "Testfile.xml"); 

但正如托馬斯Naros指出,這給你定位於構建路徑的文件。