gpt4 book ai didi

java - 在类路径中定位文件

转载 作者:搜寻专家 更新时间:2023-10-30 21:02:14 25 4
gpt4 key购买 nike

我正在尝试读取文件内容,例如:

public void myMethod(){
FileInputStream fstream = new FileInputStream(fileLocation);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
while ((strLine = br.readLine()) != null) {
....
....
.....
end while
end method

我在类主体的开头有 private String fileLocation;,在类的结尾我有一个 getter 和 setter。现在我正在尝试从这个类的 bean 中的 spring 中注入(inject)这个文件位置,并且我指定了这个类的初始化方法。但是我得到错误找不到指定的文件,就好像它不在类路径上但它在 war 文件中一样?我正在使用 Maven 构建项目,并将文件放入 src/main/resources 这是我在尝试读取文件时遇到的错误:

Error: src\main\resources\ids.txt (The system cannot find the path specified)

那是我尝试这个的时候:

FileInputStream fstream = new FileInputStream("src\\main\\resources\\ids.txt");

如何从类路径中正确引用?

编辑

当我根据@BalusC 解决方案编辑我的代码时,它看起来是这样的,但我仍然得到 null 错误:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
InputStream input = classLoader.getResourceAsStream("src/main/resources/ids.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(input));
String strLine;
while ((strLine = br.readLine()) != null) {
....
....
.....
end while
end method

最佳答案

Java IO API 依赖于本地磁盘文件系统,而不是类路径。此外,在 Java IO 中使用相对路径会带来可移植性问题,不要依赖它。要在类路径中分配资源,您通常会使用 ClassLoader#getResource()ClassLoader#getResourceAsStream() .

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("src/main/resources/ids.txt");

就是说,您不需要 DataInputStream 行。您实际上并没有从中得到任何好处。

更新:如果这不起作用,那么要么资源名称无效,要么文件实际上不在您期望的类路径中。我认为 src 文件夹实际上是类路径的 root 而不是包的一部分。将其从名称中删除。

更新 2:要获取运行时类路径涵盖的所有根磁盘文件系统路径,请执行以下操作:

for (URL root : Collections.list(Thread.currentThread().getContextClassLoader().getResources(""))) {
System.out.println(root);
}

资源名称需要与它们中的任何一个相关。它在构建过程中被放置在 /WEB-INF/classes 中是正常的。它被类路径覆盖。你的问题出在别处。您确定资源名称正确吗?您确定您正在运行您认为正在运行的代码吗?

关于java - 在类路径中定位文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2666875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com