是否记录了getResourceAsStream的目录列表行为?

时间:2017-05-13 14:57:04

标签: java

各种答案(例如Get a list of resources from classpath directory)表示如果您在目录上调用getResourceAsStream,则返回的流将包含目录中的项目列表,每行一个。这似乎没有在ClassLoader Javadoc中记录。它是在其他地方指定的,还是仅仅是人们依赖的实现细节?

1 个答案:

答案 0 :(得分:3)

看起来在任何地方都没有适当记录。

ClassLoader.getResourceAsStream的Javadoc中,您可以推断getResourceAsStream与执行getResource相同,然后在生成的网址上调用URL.openStream,因为Javadoc指向getResource方法,返回URL。但显然没有明确说明这一点。

  

public InputStream getResourceAsStream(String name)

     

返回一个输入   用于读取指定资源的流。搜索顺序是   在getResource(String)的文档中描述。

然后,更好地记录URL.openStream

  

public final InputStream openStream() throws IOException

     

打开与此URL的连接并返回一个用于读取的InputStream   从那个连接。此方法是以下的简写:        openConnection().getInputStream()

然后,由于URL.openConnection()返回URLConnection的子类,并假设您在类路径中使用了本地目录,因此需要查看FileURLConnection,然后在方法{中{3}}。

正如您在下面的方法中所看到的,如果类路径中的file:/// URL指向某个目录,那么它将以排序的方式返回目录中所有文件的InputStream。 (有趣的细节,它使用平台默认编码 - 很高兴知道你何时想要读回数据)

public synchronized InputStream getInputStream()
    throws IOException {

    int iconHeight;
    int iconWidth;

    connect();

    if (is == null) {
        if (isDirectory) {
            FileNameMap map = java.net.URLConnection.getFileNameMap();

            StringBuffer buf = new StringBuffer();

            if (files == null) {
                throw new FileNotFoundException(filename);
            }

            Collections.sort(files, Collator.getInstance());

            for (int i = 0 ; i < files.size() ; i++) {
                String fileName = files.get(i);
                buf.append(fileName);
                buf.append("\n");
            }
            // Put it into a (default) locale-specific byte-stream.
            is = new ByteArrayInputStream(buf.toString().getBytes());
        } else {
            throw new FileNotFoundException(filename);
        }
    }
    return is;
}

结论:

没有正确记录,它是一个实施细节,它可能会在未来的版本中发生变化,尽管不太可能。