【问题标题】:get csv file from jar从jar中获取csv文件
【发布时间】:2019-05-23 20:50:01
【问题描述】:

我有以下代码行:

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 来获取类对象,这反过来使我们能够访问 getResourceAsStream 用来定位文件的类加载器。

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

【问题讨论】:

    标签: java inputstreamreader methodhandle


    【解决方案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 的路径?

    系统类加载器提供对CLASSPATH 中信息的访问。 CLASSPATH 可能包含目录和 JAR 文件。因此,您可以访问项目的所有资源以及它们在类路径中的 jar 文件。

    【讨论】:

    • 请从链接中插入足够的信息,以便您的答案可以独立存在,即使链接的页面(出于任何原因)无法访问。一个很好的测试是阅读打印出来的版本。
    • @ThorbjørnRavnAndersen 感谢您的建议。我会努力做到的。
    • @Spara 感谢您的帮助,但我不得不否决您的回答。我已经阅读了文档,它们写得不好,并不能帮助我理解这些方法。查看修改后的问题
    • @DCR 如果您阅读了文档并且在您的问题中没有提及(即使您不理解它),您不能责怪其他人认为您不知道他们的存在自认是新手。我建议不要对答案投反对票。
    • 您不需要实现自己的 copy-Enumeration-to-List 例程。只需使用list = Collections.list(systemResources)
    猜你喜欢
    • 1970-01-01
    • 2018-06-19
    • 2019-11-08
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 2013-05-12
    • 1970-01-01
    相关资源
    最近更新 更多