【问题标题】:How to not hard-code a file path如何不对文件路径进行硬编码
【发布时间】:2015-11-03 16:26:26
【问题描述】:

我想使用此实现计算放入源包中的文件的路径:

URL pathSource = this.getClass().getResource("saveItem.xml");

当我尝试像下面的代码一样创建一个新文件时:

File xmlFile = new File(pathSource.toString());

我尝试用它来创建这样的文档:

Document document = builder.parse(xmlFile);

这给了我java.io.FileNotFoundException。 如何在不进行硬编码的情况下计算文件路径?

PS:我已经使用了 pathSource.getPath() 但它也不起作用。 我想使用类似的实现:

FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml"));

PPS:结构如下:

【问题讨论】:

  • 您是从 jar 还是从 IDE 运行它?

标签: java javafx filepath hardcoded


【解决方案1】:

您不能以 File 实例的形式访问 JAR 文件中的资源。你只能得到一个InputStream

因此,以下行

File xmlFile = new File(pathSource.toString());

无法正常工作,当稍后尝试读取它时,将抛出 FileNotFoundException

假设您尝试使用 DocumentBuilder 解析 XML 文件,您可以使用 parse(InputStream) 方法:

try (InputStream stream = this.getClass().getResourceAsStream("saveItem.xml")) {
    Document document = builder.parse(stream);
}

【讨论】:

    【解决方案2】:

    简答 - saveItem.xml 不在类路径中。 如果是 Web 应用程序,则可以将文件添加到 WEB-INF/classes 文件夹中。

    编辑: 也试试this.getClass().getResourceAsStream()

    【讨论】:

      【解决方案3】:
      getClass().getResource("saveItem.xml");
      

      在与getClass() 返回的类相同的包(查看文件系统时为目录)中查找文件。

      确保文件在其中。还要确保在运行代码时它确实在其中,源文件夹与放置已编译类文件的 targetbin 文件夹之间存在差异。

      还要检查 pathSource.toString() 包含的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-11
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-30
        • 1970-01-01
        • 2017-12-02
        相关资源
        最近更新 更多