getResourceAsStream 的目录列表行为是否记录在任何地方?

mhs*_*ith 5 java

各种答案(例如,从类路径目录获取资源列表)表明,如果您调用getResourceAsStream目录,返回的流将包含目录中的项目列表,每行一个。这似乎没有记录在ClassLoader Javadoc 中。它是在其他地方指定的,还是只是人们依赖的实现细节?

Erw*_*idt 3

看起来这并没有在任何地方得到适当的记录。

从 Javadoc 中,ClassLoader.getResourceAsStream您可以在某种程度上推断出这与执行然后调用结果 URLgetResourceAsStream相同,因为 Javadoc 指向该方法,该方法返回. 但它显然没有阐明到那么准确的程度。getResourceURL.openStreamgetResourceURL

public InputStream getResourceAsStream(String name)

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

然后,URL.openStream记录得更好:

public final InputStream openStream() throws IOException

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

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

正如您在下面的方法中看到的,如果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;
}
Run Code Online (Sandbox Code Playgroud)

结论:

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