2011-06-06 101 views
0

我想从放置jar文件的目录中获取文本文件。从放置jar文件的特定目录获取文件

假设我的桌面应用程序'foo.jar'文件放置在d:\安装的Windows中。 在'foo.jar'应用程序运行时,我想在同一个目录下有一个test.txt文件。 如何在我的'foo.jar'应用程序中获取特定路径? 总之,我想获取放置它的'foo.jar'文件的路径。

回答

3

注意,实际的代码不依赖于实际的类位置的包内,但在总体上可能看起来像:

URL root = package.Main.class.getProtectionDomain().getCodeSource().getLocation(); 
String path = (new File(root.toURI())).getParentFile().getPath(); 
... 
// handle file.txt in path 
+0

嘿它是格栅,但仍然无法读取test.txt文件。有什么想法吗? – Nirav 2011-06-06 05:27:01

+0

@Nirav:尝试呼应'路径'到标准输出,它会让事情变得更容易理解;您可能还必须将'file.txt'放到您的'build'路径中进行测试。 – 2011-06-06 05:29:45

+0

不,它不工作。 – Nirav 2011-06-06 05:38:36

1

大多数JAR文件使用的是记得从哪里JAR有codesource的一个URLClassLoader的装已加载。您可以使用这些知识来获取JVM从JVM加载的目录位置。您也可以使用ProtectionDomain类来获取CodeSource(如其他答案中所示;诚然,这可能会更好)。

返回的位置通常为file:协议类型,因此您必须移除此协议标识符以获取实际位置。以下是执行此活动的简短片段;您可能希望建立更多的错误检查和边缘检测的情况下,如果你需要在生产中使用它:

public String getCodeSourceLocation() { 
     ClassLoader contextClassLoader = CurrentJARContext.class.getClassLoader(); 
     if(contextClassLoader instanceof URLClassLoader) 
     { 
      URLClassLoader classLoader = (URLClassLoader)contextClassLoader; 
      URL[] urls = classLoader.getURLs(); 
      String externalForm = urls[0].toExternalForm(); 
      externalForm = externalForm.replaceAll("file:\\/", ""); 
      externalForm = externalForm.replaceAll("\\/", "\\" + File.separator); 
      return externalForm; 
     } 
     return null; 
    } 
0

我发现我自己的问题的最简单的回答。
String path = System.getProperty(“user.dir”);

+1

仅当您从同一目录启动java可执行文件时才有效。 – 2011-06-06 07:36:12

+0

抱歉,我无法得到你能请你解释一下例子。 – Nirav 2011-06-06 07:37:58

+0

如果您从'C:'''java_jar D:> aJAR.jar'启动应用程序,user.dir将包含'C:''而不是'D:>'。 – 2011-06-06 07:41:24