Java 在类路径中定位文件
我正在尝试读取文件内容,例如:Java 在类路径中定位文件,java,Java,我正在尝试读取文件内容,例如: public void myMethod(){ FileInputStream fstream = new FileInputStream(fileLocation); BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); String strLine; while ((strLine = br.readLine()) != null)
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
在类bodyprivate String fileLocation的开头,我有一个在一个类的末尾,我有一个getter和setter。现在,我尝试从这个类的bean中从spring注入这个文件位置,并指定这个类的init方法。但是我得到的错误是找不到指定的文件,好像它不在类路径上,但它在war文件中?我正在使用maven构建项目,并将文件放入src/main/resources
这是我在尝试读取文件时遇到的错误:
错误:src\main\resources\ids.txt
(系统找不到路径
(指定)
就在那时,我尝试了这个:
FileInputStream fstream = new FileInputStream("src\\main\\resources\\ids.txt");
如何从类路径正确地引用
编辑
当我根据@BalusC solution编辑代码时,下面是它的外观,但我仍然得到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依赖于本地磁盘文件系统,而不是类路径。此外,在JavaIO中使用相对路径会带来可移植性问题,不要依赖它。在通常使用或的类路径中分配资源
也就是说,您不需要DataInputStream
行。你实际上没有从中得到任何好处
更新:如果这不起作用,那么要么资源名称根本无效,要么文件实际上不在您期望的类路径中。我认为src
文件夹实际上是类路径的根,而不是包的一部分。将其从名称中删除
更新2:要获取运行时类路径覆盖的所有根磁盘文件系统路径,请执行以下操作:
for (URL root : Collections.list(Thread.currentThread().getContextClassLoader().getResources(""))) {
System.out.println(root);
}
资源名称需要与它们中的任何一个相对。在构建期间将其放置在/WEB-INF/classes
中是正常的。它由类路径覆盖。你的问题在别的地方。您确定资源名称正确吗?你确定你正在运行你认为正在运行的代码吗?@BalusC同样,当我删除src
位时,我得到null,我刚刚查看了部署在jboss上的target war的内部,该文件位于WEB-INF/classes
中,但在我的eclipse项目中,它位于src/main/resources
中,还有其他一些技巧吗?@BalusC我可以看看这个类加载器的位置吗,进入哪个文件夹或..@BalusC这是一个好消息,我找到了使用for循环需要做的事情。我只需要把ids.txt
放进去,就足够读了。万分感谢
for (URL root : Collections.list(Thread.currentThread().getContextClassLoader().getResources(""))) {
System.out.println(root);
}