【问题标题】:Determine CLASSPATH resource file size确定 CLASSPATH 资源文件大小
【发布时间】:2016-03-07 07:52:16
【问题描述】:

问题

是否可以确定任意类路径资源的大小?这是下面的假设构建(完全披露:我不是谷歌)。在这种情况下,我想获取 icon.png 的大小。

    • com
      • 谷歌
        • App.java
        • icon.png
        • app.json

我知道我可以使用它的 URI(来自类路径 URL)从这个资源创建一个路径/文件并获取它的大小。

Files.size(Path.get(ClassLoader.getSystemResource(iconPath).toURI()))

但据我了解,当我将其部署在 JAR 中或使用 AOT 编译工具(例如 Excelsior JET)时,这将不起作用。

注意:在这两种情况下(ExcelsiorJAR)我都可以正常加载 icon.png

只是为了澄清。我的目标是从给定资源中获取文件!目标是获取资源的大小。以上只是一个错误解决方案的示例。

原因

在运行时加载许多资源时获取准确的进度信息。

将当前进度从当前处理的字节数等于要处理的总字节数。

TL;DR我只需要有人告诉我这是不可能的,以便我想出一个不同的解决方案。

【问题讨论】:

    标签: java classpath classloader


    【解决方案1】:

    宾果游戏。找到了答案,并希望与其他尝试做同样事情的人分享。

    诀窍是从类加载器提供的 URL 中获取内容长度。看起来有点像这样:

    ClassLoader.getSystemResource(iconPath).openConnection().getContentLength();
    

    我猜这意味着 JRE 在 URL 连接的 content-length 标头字段中提供了资源的大小。

    编辑

    • 根据来自 cmets 的 EJP:

      • 它提供了它,但不在标题中。资源 URL 是一个神奇的系统: URL 类型由实现的 URLConnection 子类支持 getContentLength() 通过查看实际资源。

    我继续尝试了来自 URL 连接的其他可用标头查询。那就是:

    • 获取内容长度
    • 获取内容编码
    • 获取内容类型
    • 获取日期
    • getExpiration
    • getLastModified

    这是我的结果:

    getContentLength:           2817
    getContentEncoding:         null
    getContentType:             image/png
    getDate:                    0
    getExpiration:              0
    getLastModified:            1456358464819
    

    看起来唯一有用的信息(我对此更满意)是内容长度类型已修改

    我继续确认这适用于 Executable JARsExcelsior JET 11 构建的应用程序

    注意:这是在运行 SE 1.8.0_72Windows 10 家庭版 机器上测试的。换句话说,我不确定标头信息是否在其他操作系统或较低版本的 Java 上可用。

    尽管如此,干杯。

    【讨论】:

    • 它提供了它,但不在标题中。资源 URL 是一种神奇的 system: URL 类型,它由 URLConnection 子类支持,该子类通过查看实际资源来实现 getContentLength()。在调用 openConnection() 之前,您需要对返回的 URL 进行空值检查。
    • 感谢您提供的信息! @ null 检查:这根本不是我实际获取 URL/URLConnection 的方式——我们的 API 包含了 null 检查和异常处理,不用担心。我只是想简洁。
    猜你喜欢
    • 2011-08-28
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多