Java中的父级父目录

5
请帮我解释一下,为什么当我运行这段代码时,一切都很正常,我可以得到我的类的父目录:
URL dirUrl = PathsService.class.getResource("..");

当我运行这段代码:
URL dirUrl = PathsService.class.getResource("../..");

我在dirUrl中得到了null

我尝试这样做:URL dirUrl = PathsService.class.getResource("..//.."); 但是无论如何,dirUrl都为null

在Java中,我怎样才能获取父/父/父...目录?


你的目录结构是什么? - gkalpak
@Pablo,你说的“你是如何运行它”的意思是什么?你想知道我的IDE还是其他什么? - Boris Mitioglov
那个评论根本没有回答为什么你关心这些路径。祖先目录是什么并不重要吧? - Andrew Thompson
3
我看到过@AndrewThompson,总是抱怨!! 你帮助很少,关掉更多 - anshulkatta
@AndrewThompson 因为我需要从父目录中获取XML文件并解析它们。我使用 ".." 代替完整路径,因为我的代码必须在其他计算机上编译。 - Boris Mitioglov
显示剩余6条评论
2个回答

12

注意:

  1. 正如其他人已经指出的那样,基于检索某个父目录来实现任何功能是一个非常糟糕的设计想法(而且几乎肯定会失败)。
  2. 如果您分享更多关于您试图实现什么(大局观)的细节,某人可能会提出更好的解决方案。

话虽如此,您可以尝试以下代码:

import java.nio.file.*;
...
Path path = Paths.get(PathsService.class.getResource(".").toURI());
System.out.println(path.getParent());               // <-- Parent directory
System.out.println(path.getParent().getParent());   // <-- Parent of parent directory

请注意,上述技术可能在您的开发环境中有效,但在应用程序“正确”部署后,可能会产生意外结果。


请给我建议,如果我正在做的是一个不好的设计想法,如何加载我的文件,因为它们在我的父级目录中。 - Boris Mitioglov
我需要解析位于“父父”目录中的XML文件。 - Boris Mitioglov
我觉得我表达不太准确,应该用“获取”而不是“加载”。 - Boris Mitioglov
XML文件会被包含在你的应用程序JAR中吗? - gkalpak
1
如果你的类在包foo/bar中(即foo/bar/YourClass.class),你可以访问该子树中放置的所有资源,例如:foo/res/demo.xml可以通过YourClass.class.getResource("/foo/res/demo.xml")或者...("../res/demo.xml")来访问。如果你的资源不在你的包子树中,而是相对于系统根目录的特定路径,则可以直接使用绝对路径访问它们(例如/home/me/resources/demo.xml)。 - gkalpak
显示剩余4条评论

7
你得到的结果是完全正确的。
我认为你误解了class.getResource的用法。
假设你有一个名为com.test的包,并且在其中有一个名为MyClass的类。
这个MyClass.class.getResource(".")会给你正在执行的文件的位置。也就是MyClass的位置。
这个MyClass.class.getResource("..")将会向上一级,返回test目录的位置。
这个MyClass.class.getResource("../..")将会向上两级,返回com目录的位置。
现在,这个MyClass.class.getResource("../../..")将会尝试向上一级,但由于不存在包目录,所以会返回null
因此,class.getResource不会超出定义的包结构并开始访问计算机目录。这就是它不起作用的原因。它只在当前的类包结构中搜索。

3
谢谢您的提问。我能够成功地使用MyClass.getClass().getResource(".")找到MyClass的位置,当在Eclipse中运行应用程序时。然而,当我部署该应用程序并运行jar文件时,getResource(".")返回null。请问您知道如何修复这个问题吗? - Joe Slater
有任何错误吗? - Ravi Trivedi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接