我想从放置jar文件的目录中获取文本文件。从放置jar文件的特定目录获取文件
假设我的桌面应用程序'foo.jar'文件放置在d:\安装的Windows中。 在'foo.jar'应用程序运行时,我想在同一个目录下有一个test.txt文件。 如何在我的'foo.jar'应用程序中获取特定路径? 总之,我想获取放置它的'foo.jar'文件的路径。
我想从放置jar文件的目录中获取文本文件。从放置jar文件的特定目录获取文件
假设我的桌面应用程序'foo.jar'文件放置在d:\安装的Windows中。 在'foo.jar'应用程序运行时,我想在同一个目录下有一个test.txt文件。 如何在我的'foo.jar'应用程序中获取特定路径? 总之,我想获取放置它的'foo.jar'文件的路径。
注意,实际的代码不依赖于实际的类位置的包内,但在总体上可能看起来像:
URL root = package.Main.class.getProtectionDomain().getCodeSource().getLocation();
String path = (new File(root.toURI())).getParentFile().getPath();
...
// handle file.txt in path
大多数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;
}
我发现我自己的问题的最简单的回答。
String path = System.getProperty(“user.dir”);
仅当您从同一目录启动java可执行文件时才有效。 – 2011-06-06 07:36:12
抱歉,我无法得到你能请你解释一下例子。 – Nirav 2011-06-06 07:37:58
如果您从'C:'''java_jar D:> aJAR.jar'启动应用程序,user.dir将包含'C:''而不是'D:>'。 – 2011-06-06 07:41:24
嘿它是格栅,但仍然无法读取test.txt文件。有什么想法吗? – Nirav 2011-06-06 05:27:01
@Nirav:尝试呼应'路径'到标准输出,它会让事情变得更容易理解;您可能还必须将'file.txt'放到您的'build'路径中进行测试。 – 2011-06-06 05:29:45
不,它不工作。 – Nirav 2011-06-06 05:38:36