Java中的文件路径或文件位置 - new file()

10

我有一个项目的以下结构。

在 Eclipse 中:

myPorjectName
  src
    com.example.myproject
        a.java
    com.example.myproject.data
        b.xml

a.java 中,我想读取 b.xml 文件。我该怎么做?具体来说,在 a.java 中,我使用了以下代码:

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse (new File("data/b.xml"));

这段代码找不到 b.xml 文件。但是,如果我将路径更改为 src/com/example/myproject/data/b.xml,它就可以工作了。当前位置似乎在我的项目文件的根目录。

但是我看到其他人的示例中,如果 b.xmla.java 在同一个文件夹中,则我们可以直接使用 new File("b.xml") 但是我尝试将 b.xml 放在与 a.java 相同的文件夹中而不是放在子文件夹中,但它仍然无法正常工作。如果这样能行的话,那么在我的情况下,我应该能够使用 new File("data/b.xml"),对吗?我真的不明白为什么这不起作用。


2
很可能更像是getClass().getResourceAsInputStream("/com/example/myproject/data/b.xml"); - MadProgrammer
它无法正常工作,因为您的**默认目录(Java正在执行的目录)**是myPorjectName,而不是myproject - xagyg
xagyg和MadProgrammer的评论让我明白了我做错了什么。谢谢你们。下面的答案让我学到了更多东西。 - Joey
1个回答

22
如果它已经在类路径中并且在同一个包中,请使用。
URL url = getClass().getResource("b.xml");
File file = new File(url.getPath());

或者,将其读取为InputStream

InputStream input = getClass().getResourceAsStream("b.xml");

在一个static方法内部,您可以使用

InputStream in = YourClass.class.getResourceAsStream("b.xml");

如果你要从一个类中访问不在同一个包中的文件,那么你需要使用以'/'开头的相对路径。

ex : InputStream input = getClass().getResourceAsStream
           ("/resources/somex.cfg.xml");which is in another jar resource folder

我认为这是最好的方式! - buch11
如果不在同一个包中怎么办?在我的例子中,a.java在com.example.myproject中,而b.xml在com.example.myproject.data中。 - Joey
@user1387727 使用完全限定路径,例如 "/com/example/myproject/data/b.xml",而不是... - MadProgrammer
在我的情况下,我正在尝试使用以下代码读取一个XML文件: URL url = getClass().getResource("b.xml"); Document doc = docBuilder.parse (new File(url.getPath())); 假设a.java和b.xml位于同一个文件夹中,但不起作用。 我打印出了url.getPath(),发现路径是从/c:/.../.../../myproject/bin/com/../../b.xml开始的。 实际上,代码docBuilder.parse(new File(url.getPath()))不喜欢全文件路径。如果我手动键入文件路径:docBuilder.parse(new File("bin/com/../../b.xml")),那么它会工作。 您知道我可以做些什么来代替手动输入文件路径吗? - Joey
第一个只有在JAR或WAR文件已经被解压,或者一开始就没有JAR或WAR文件,只有一个.class文件的目录系统时才能工作。 - user207421

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