2010-05-26 111 views

回答

11

您可以使用CodeSource#getLocation()CodeSource可通過ProtectionDomain#getCodeSource()獲得。 ProtectionDomain又可通過Class#getProtectionDomain()獲得。

URL location = getClass().getProtectionDomain().getCodeSource().getLocation(); 
File file = new File(location.getPath()); 
// ... 

這將返回Class問題的確切位置。

更新:根據評論,它顯然已經在類路徑中。然後您可以使用ClassLoader#getResource(),其中您傳遞了根目錄相對路徑。

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
URL resource = classLoader.getResource("filename.ext"); 
File file = new File(resource.getPath()); 
// ... 

你甚至可以把它作爲使用ClassLoader#getResourceAsStream()InputStream

InputStream input = classLoader.getResourceAsStream("filename.ext"); 
// ... 

這也是使用打包資源的正常方式。如果它位於包裝內,則改爲使用com/example/filename.ext

+1

+1,但注意p rotectionDomain.getCodeSource()和CodeSource.getLocation()都可以爲null。 – 2010-05-26 18:22:28

+0

@bkail:當它使用設計不佳的本土類加載器加載時,或者從某個外部流源加載時,它確實可能會返回null。但是,這通常不適用於具有'main() '。 – BalusC 2010-05-26 18:26:44

+0

這絕對是做這份工作 - 但它看起來不太好。我需要做的是加載一個配置文件,它需要與我的jar文件在同一個文件夾中,但可以從任何位置運行。這是獲取文件位置信息的正確方法嗎? – markovuksanovic 2010-05-26 21:34:02

-1

,如果你想獲得當前正在運行的程序「工作目錄」,然後只需使用:

new File(""); 
+2

工作目錄不一定在程序所在的位置。 – Douglas 2012-02-28 15:57:11