确定CLASSPATH资源文件大小

时间:2016-03-06 21:09:24

标签: java classpath classloader

问题

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

  • SRC
    • COM
      • 谷歌
        • App.java
        • 的icon.png
        • app.json

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

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

但是我的理解是,当我在JAR中部署它或使用诸如Excelsior JET的AOT编译工具时,这不会起作用。

注意:在这两种情况下( Excelsior JAR ),我都可以加载 icon.png

只是澄清一下。我的目标是从给定资源获取文件!目标是获得资源的大小。以上只是一个破碎解决方案的例子。

原因

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

  

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

修改

  • 根据EJP的评论:

    •   

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

我继续前进并从URL连接中提供了其他可用的标头查询。那就是:

  • getContentLength
  • getContentEncoding
  • 的getContentType
  • GETDATE
  • getExpiration
  • getLastModified

这是我的结果:

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

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

我继续并确认这适用于可执行JAR Excelsior JET 11构建的应用程序

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

然而,干杯。