各种答案(例如Get a list of resources from classpath directory)表示如果您在目录上调用getResourceAsStream
,则返回的流将包含目录中的项目列表,每行一个。这似乎没有在ClassLoader Javadoc中记录。它是在其他地方指定的,还是仅仅是人们依赖的实现细节?
答案 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;
}
没有正确记录,它是一个实施细节,它可能会在未来的版本中发生变化,尽管不太可能。