我正在尝试获取给我的java项目中资源的完整文件路径。代码无法仅使用文件名查找文件。我需要帮助才能使它发挥作用。
这是项目结构:
这是代码:
package com.testing.software.apps;
public class FileTest {
public static void main(String[]args) {
String fileName = "orders-2017.txt";
String filePath = getFilePath(fileName);
System.out.println("File path is: " + filePath);
}
public static String getFilePath(String fileName) {
String fullFilepath = Thread.currentThread().
getContextClassLoader().
getResource(fileName).
getPath();
return fullFilepath;
}
}
此代码在" getPath();"中引发空指针异常。线。我发现异常发生是因为这行" getResource(fileName)"返回一个空URL对象。在检查getResource代码时,我终于看到" url = findResource(name);"返回null。
public URL getResource(String name) {
URL url;
if (parent != null) {
url = parent.getResource(name);
} else {
url = getBootstrapResource(name);
}
if (url == null) {
url = findResource(name);
}
return url;
}
查看java.net.URL findResource的定义,我发现它总是返回null,从而一直给我一个null。
protected URL findResource(String name) {
return null;
}
有人可以解释一下为什么这段代码总是会给出null,以及如何只使用文件名让它找到文件?
答案 0 :(得分:2)
ClassLoader是一个抽象类。方法findResource在默认实现中返回null。在运行时,应该使用和实现此类来覆盖此方法。
/**
* Finds the resource with the given name. Class loader implementations
* should override this method to specify where to find resources.
*
* @param name
* The resource name
*
* @return A <tt>URL</tt> object for reading the resource, or
* <tt>null</tt> if the resource could not be found
*
* @since 1.2
*/
protected URL findResource(String name) {
return null;
}
你错了,因为你使用了错误的路径。您应该添加目录,因为该方法不会递归通过资源目录。试试fileName = "text-files/orders/orders-2017.txt";
如果您使用默认的maven路径配置,并且如果要在main函数中使用此资源,则应将它们移动到src / main / resources。
如果你想将它们保存在src / test / java中,那么它们只能在src / test / java目录中的类中使用。