Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确定类路径资源文件大小 问题_Java_Classpath_Classloader - Fatal编程技术网

Java 确定类路径资源文件大小 问题

Java 确定类路径资源文件大小 问题,java,classpath,classloader,Java,Classpath,Classloader,是否可以确定任意类路径资源的大小?下面是一个假设的构建(完全公开:我不是谷歌)。在本例中,我希望获得icon.png的大小 src com 谷歌 App.java icon.png app.json 我知道我可以使用这个资源的URI(从类路径URL)创建一个路径/文件,并获得它的大小 Files.size(Path.get(ClassLoader.getSystemResource(iconPath.toURI())) 但我的理解是,当我将其部署在JAR中或使用AOT编译工具(

是否可以确定任意类路径资源的大小?下面是一个假设的构建(完全公开:我不是谷歌)。在本例中,我希望获得icon.png的大小

  • src
    • com
      • 谷歌
        • App.java
        • icon.png
        • app.json
我知道我可以使用这个资源的URI(从类路径URL)创建一个路径/文件,并获得它的大小

Files.size(Path.get(ClassLoader.getSystemResource(iconPath.toURI()))
但我的理解是,当我将其部署在JAR中或使用AOT编译工具(如)时,这将不起作用

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

我只是想澄清一下。我的目标是而不是从给定资源获取文件!目标是获得资源的大小。以上只是一个失败解决方案的示例

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

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


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

答对了。找到了一个答案,并想与其他尝试做同样事情的人分享

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

ClassLoader.getSystemResource(iconPath).openConnection().getContentLength();
我猜这意味着JRE在URL连接的content length头字段中提供了资源的大小

编辑

  • 根据EJP的意见:


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

我继续往下说,并对URL连接中的其他可用标题查询进行了尝试。即:

  • getContentLength
  • getContentEncoding
  • getContentType
  • getDate
  • 获取到期日
  • getLastModified
以下是我的结果:

getContentLength:           2817
getContentEncoding:         null
getContentType:             image/png
getDate:                    0
getExpiration:              0
getLastModified:            1456358464819
看起来唯一有用的信息(我非常满意)是内容长度类型修改的

我继续并确认,这对可执行JARExcelsior JET 11构建的应用程序都有效

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


尽管如此,干杯。

它提供了它,但不是在标题中。资源URL是一种神奇的
系统:
URL类型,它由
URLConnection
子类支持,该子类通过查看实际资源来实现
getContentLength()
。在调用
openConnection()
之前,您需要对返回的URL进行null检查。谢谢您提供的信息!@空检查:这根本不是我实际获取URL/URLConnection的方式——我们的API涵盖了空检查和异常处理,恐怕没有。我只是想简明扼要。