如何不硬编码文件路径
How to not hard-code a file path
我想使用此实现计算放入源包中的文件的路径:
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: 结构如下:
简答 - saveItem.xml 不在类路径中。
如果它是 Web 应用程序,则文件可能会添加到 WEB-INF/classes 文件夹。
编辑:
也试试 this.getClass().getResourceAsStream()
。
getClass().getResource("saveItem.xml");
在与 getClass()
returns.
的 class 相同的包(当您查看文件系统时是目录)中查找文件
确保文件在那里。当您 运行 您的代码时,还要确保它确实存在于其中,源文件夹与放置已编译 class 文件的 target
或 bin
文件夹之间存在差异。
同时检查 pathSource.toString()
包含的内容。
您无法访问 JAR 文件中作为 File
实例的资源。你只能得到一个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);
}
我想使用此实现计算放入源包中的文件的路径:
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: 结构如下:
简答 - saveItem.xml 不在类路径中。 如果它是 Web 应用程序,则文件可能会添加到 WEB-INF/classes 文件夹。
编辑:
也试试 this.getClass().getResourceAsStream()
。
getClass().getResource("saveItem.xml");
在与 getClass()
returns.
确保文件在那里。当您 运行 您的代码时,还要确保它确实存在于其中,源文件夹与放置已编译 class 文件的 target
或 bin
文件夹之间存在差异。
同时检查 pathSource.toString()
包含的内容。
您无法访问 JAR 文件中作为 File
实例的资源。你只能得到一个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);
}