Java - 使用getResourceAsStream读取资源(String)

时间:2017-07-04 13:35:25

标签: java resources

如果在File.separator的搜索路径的字符串中使用getResourceAsStream(String name),有人可以解释为什么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更灵活。在这种情况下,它不是。我想知道,为什么。非常感谢。

1 个答案:

答案 0 :(得分:0)

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

Class javadoc

  

在委托之前,从中构造绝对资源名称   使用此算法给定资源名称:

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').

您的File.separator会为unix和Windows计算机返回不同的结果。如果在这种情况下使用mack或unix,则代码将起作用,但在win机器中失败。

File javadoc

  

public static final char separatorChar

     

系统相关的默认名称分隔符。这个领域是   初始化为包含系统值的第一个字符   property file.separator。在UNIX系统上,此字段的值为   '/';在Microsoft Windows系统上它是'\'。