Java-使用getResourceAsStream读取资源(字符串)

Java-使用getResourceAsStream读取资源(字符串),java,resources,Java,Resources,有人能解释一下,如果在getResourceAsStream(字符串名称)中的搜索路径字符串中使用File.separator,为什么Java找不到资源吗?我有以下代码: private final String RESOURCE_PATH = File.separator + "dir" + File.separator; private final String SAME_PATH_HARDCODED = "/dir/"; public void findResource(String f

有人能解释一下,如果在
getResourceAsStream(字符串名称)
中的搜索路径字符串中使用
File.separator
,为什么Java找不到资源吗?我有以下代码:

private final String RESOURCE_PATH = File.separator + "dir" + File.separator;
private final String SAME_PATH_HARDCODED = "/dir/";

public void findResource(String fileName) {
    InputStream file1 = ThisClass.class
            .getResourceAsStream(RESOURCE_PATH + fileName);  // returns null

    InputStream file2 = ThisClass.class
            .getResourceAsStream(SAME_PATH_HARDCODED + fileName);  // returns file
}

我发现,
File.separator
使用反斜杠而不是斜杠。但我希望File.separator更灵活。在这种情况下,情况并非如此。我想知道,为什么。非常感谢。

因为当您将
\\
分隔符传递给
getResourceAsStream()
方法时,它会以另一种方式解释指向目录的路径,实际上是在目录之前添加了包名

在委托之前,将根据 使用此算法的给定资源名称:

If the name begins with a '/' ('\u002f'), then the absolute name of the resource is the portion of the name following the '/'.
Otherwise, the absolute name is of the following form:

    modified_package_name/name 

Where the modified_package_name is the package name of this object with '/' substituted for '.' ('\u002e').
您的
文件.separator
为unix和windows计算机返回不同的结果。如果您在这种情况下使用mack或unix,您的代码将正常工作,但在win机器中失败

公共静态最终字符分离器char

依赖于系统的默认名称分隔符。这个领域是 初始化为包含系统值的第一个字符 属性文件.separator。在UNIX系统上,此字段的值为 '/'; 在Microsoft Windows系统上,它是“\”


我尝试了相同的方法,但没有得到任何异常。没有异常,因为如果找不到,该方法将返回null。