我有以下代码行:
InputStreamReader isr = new InputStreamReader(MethodHandles.lookup().lookupClass().getResourceAsStream(csvFile));
有人能向新手解释一下吗:
MethodHandles.lookup()
lookupClass()
getResourceasStream()
该代码工作并访问位于jar中的csv文件。我只是不明白每种方法都在做什么
我能够将线路简化为:
InputStreamReader isr = new InputStreamReader (SQLUtilPROD.class.getResourceAsStream (csvFile));
但仍然感到困惑。SQLUtilProd.class做什么?以及getResourceAsStream如何知道从jar中获取文件?如果你有多个罐子,会发生什么?
不确定,但我认为我们使用SQLUtil.class来获取类对象,这反过来又让我们可以访问classLoader,getResourceAsStream使用它来定位文件。
如果是这样的话,classLoader在哪里定义包含jar的路径?
SQLUtilProd.class做什么?
每个对象的数据都包含对java.lang.class类对象的引用,该引用由方法getClass返回。还有一个描述java.lang.Class的java.lang.CClass对象。请阅读此链接中的更多内容。
getResourceAsStream如何知道从jar中获取文件?
getResourceAsStream
将在类路径上找到具有给定名称的资源。用于搜索与给定类相关联的资源的规则由该类的定义类加载器来实现。请访问此链接。
如果您有多个罐子,会发生什么?
您可以通过以下助手函数获取所有资源:
public static List<InputStream> loadResources(
final String name, final ClassLoader classLoader) throws IOException {
final List<InputStream> list = new ArrayList<InputStream>();
final Enumeration<URL> systemResources =
(classLoader == null ? ClassLoader.getSystemClassLoader() : classLoader)
.getResources(name);
while (systemResources.hasMoreElements()) {
list.add(systemResources.nextElement().openStream());
}
return list;
}
我相信阅读这个链接会对你有所帮助。
classLoader在哪里定义包含jar的路径?
系统ClassLoader提供对CLASSPATH中信息的访问。CLASSPATH可能包含目录和JAR文件。因此,您可以访问项目的所有资源以及类路径中的jar文件。