是否可以确定任意类路径资源的大小?以下是一个假设的构建(完全披露:我不是谷歌)。在这种情况下,我想获得 icon.png 的大小。
我知道我可以使用它的URI(来自类路径URL)从这个资源创建路径/文件并获得它的大小。
Files.size(Path.get(ClassLoader.getSystemResource(iconPath).toURI()))
但是我的理解是,当我在JAR中部署它或使用诸如Excelsior JET的AOT编译工具时,这不会起作用。
注意:在这两种情况下( Excelsior 或 JAR ),我都可以加载 icon.png 。
只是澄清一下。我的目标是不从给定资源获取文件!目标是获得资源的大小。以上只是一个破碎解决方案的例子。
在运行时加载许多资源的同时获取准确的进度信息。
将当前进度从当前处理的字节数等同于要处理的总字节数。
TL; DR 我只是需要有人告诉我这是不可能的,所以我可以提出不同的解决方案。
答案 0 :(得分:3)
宾果。找到答案,并希望与其他试图做同样事情的人分享。
诀窍是从类加载器提供的URL中获取内容长度。看起来像这样的东西:
ClassLoader.getSystemResource(iconPath).openConnection().getContentLength();
我想这意味着JRE在URL连接的 content-length 标题字段中提供了资源的大小。
修改强>
根据EJP的评论:
它提供它,但不在标题中。资源URL是一个神奇的系统: URL类型,由实现的URLConnection子类支持 通过查看实际资源获得getContentLength()。
我继续前进并从URL连接中提供了其他可用的标头查询。那就是:
这是我的结果:
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。
然而,干杯。