读取.xml文件进行解析时出现FileNotFoundException错误

5

我正在使用Java编写一个程序,从XML文件中读取并解析数据。该文件被导入到我的项目的src目录下的名为“Resources”的文件夹中。我正在使用Eclipse。当我运行程序时,我遇到了以下错误:

java.io.FileNotFoundException: /Users/thechiman/Dropbox/introcs/PSU SOC Crawler/resources/majors_xml_db.xml (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
...

相关代码如下:
private void parseXML() {
    //Get a factory
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

    try {
        //Use factory to get a new DocumentBuilder
        DocumentBuilder db = dbf.newDocumentBuilder();

        //Parse the XML file, get DOM representation
        dom = db.parse("resources/majors_xml_db.xml");
    } catch(ParserConfigurationException pce) {
        pce.printStackTrace();
    } catch(SAXException se) {
        se.printStackTrace();
    } catch(IOException ioe) {
        ioe.printStackTrace();
    }
}

我不明白为什么文件明明存在,却收到了FileNotFoundException异常。谢谢你的帮助。


1
这可能不是个问题,但我想指出在你的描述中文件夹被称为“Resources”,但在代码中它是“resources”。在一个大小写敏感的路径操作系统上,这可能会导致问题。 - Ash
大写是打错了,两个地方都应该是“resources”。 - ericso
你有尝试使用这个指令吗? System.getProperty("user.dir") - James P.
1个回答

6
使用DocumentBuilder.parse(String),参数将被解释为URI,此时它将是相对URI(您提供的字符串不是“完整”URI)。目前不清楚它相对于什么,除非您提供更多有关设置的信息。运行时将把它解释为相对于某个东西,但在这里不清楚那个东西是什么。

使用其他parse方法之一(例如parse(File)parse(InputStream)),可以获得更可靠的结果。在每种情况下,都清楚您要求它解析的内容。

如果您决定首先构造一个File对象(稍后传递给parse),则需要更容易管理的问题是确保该文件存在(使用File.exists()等)。如果您无法实现到达这一步,则您的问题不在于DocumentBuilder或DOM,而在于基本的文件路径。请记住,如果您使用相对文件路径(例如new File("resources/majors_xml_db.xml")),则这将相对于进程的工作目录解析。它是否有效取决于您如何启动程序。


我尝试使用<code>File f = new File("resources/majors_xml_db.xml"</code>创建一个文件对象。然而,我遇到了之前相同的问题。我想我不理解如何正确格式化URI字符串。我的文件位于MacBook Pro上的目录中:/Users/thechiman/Dropbox/introcs/PSU SOC Crawler/resources/majors_xml_db.xml在Eclipse中,我在项目的“src”目录下创建了一个名为“resources”的目录。我将“majors_xml_db.xml”文件放在“resources”文件夹中。我不理解如何创建一个文件,请帮忙。谢谢。 - ericso
我换到了PC机器并尝试在那里编译程序。 我用“C:/ Users / Eric So / My Dropbox / introcs / PSU SOC Crawler / src / resources / majors_xml_db.xml”替换了文件路径字符串,它奏效了! 但是,这与我的本地文件结构有关。我将文件放入了Eclipse。 是否有办法使用相对文件路径“resources / majors_xml_db.xml”使其找到该文件?谢谢。 - ericso
@thechiman:是的,你需要将程序执行目录设置为 C:/Users/Eric So/My Dropbox/introcs/PSU SOC Crawler/src - skaffman

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