从罐子里获取csv文件

时间:2018-12-24 21:05:49

标签: java inputstreamreader methodhandle

我有以下代码行:

)

有人可以向新手解释吗?

InputStreamReader isr = new InputStreamReader(MethodHandles.lookup().lookupClass().getResourceAsStream(csvFile));

该代码有效并访问位于jar中的csv文件。我只是不明白每种方法在做什么

我能够将这一行简化为:

MethodHandles.lookup()
lookupClass()
getResourceasStream()

但仍然很困惑。 SQLUtilProd.class做什么?以及getResourceAsStream如何知道从jar中获取文件?如果您有多个罐子怎么办?

不确定,但是我认为我们使用SQLUtil.class来获取类对象,这又使我们能够访问classLoader,而getResourceAsStream用于定位该文件。

如果是这样,那么classLoader在哪里定义包含jar的路径?

1 个答案:

答案 0 :(得分:1)

  

SQLUtilProd.class的作用是什么?

每个对象的数据包含对java.lang.Class类的对象的引用,这由方法getClass返回。还有一个描述java.lang.Class的java.lang.Class对象。请在this链接中阅读更多内容。

  

getResourceAsStream如何知道如何从jar中获取文件?

getResourceAsStream将在类路径上找到具有给定名称的资源。用于搜索与给定类关联的资源的规则是通过该类的定义class loader来实现的。请访问this链接。

  

如果有多个罐子怎么办?

您可以使用以下帮助器功能获取所有资源:

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;
}

我确信阅读link会对您有所帮助。

  

classLoader在哪里定义包含jar的路径?

系统ClassLoader提供对CLASSPATH中信息的访问。 CLASSPATH可能包含目录和JAR文件。因此,您可以访问项目和jar文件中位于类路径中的所有资源。