获取资源的大小

时间:2015-12-18 17:22:27

标签: java scala

我正在使用getClass().getResourceAsStream(path)来读取捆绑资源。

在阅读整个流之前,如何知道文件大小?

打包时我无法使用getClass().getResource(path).toURI()访问它们,因此无效。

3 个答案:

答案 0 :(得分:1)

当然,您无法查询流的总大小,因为根据定义,它不会使整个文件可供您使用。想想在河里蹦手。你有一条小溪,但是你必须把整条河放在手中以了解总量。

在这种情况下,您必须将整个文件作为流读取并计算大小。请记住,您正在处理可能属于JAR文件或其他类型压缩资源的类和资源。在这种情况下,类加载器不必为资源提供文件句柄

答案 1 :(得分:1)

我尝试了对本帖子Ask for length of a file read from Classpath in java的回答,但他们将其标记为与您的问题重复,因此我在这里给出答案!

可以使用以下方法获取简单文件的大小:

File file = new File("C:/Users/roberto/Desktop/bar/file.txt");
long length = file.length();
System.out.println("Length: " + length);

file.txt包装在广口瓶中时,.length()将始终返回0。
因此,我们需要使用JarFile

JarFile jarFile = new JarFile("C:/Users/roberto/Desktop/bar/foo.jar");
Object size = jarFile.getEntry("file.txt").getSize();
System.out.println("Size: " + size.toString())

您也可以获取压缩后的大小:

JarFile jarFile = new JarFile("C:/Users/roberto/Desktop/bar/foo.jar");
Object compressedSize = jarFile.getEntry("file.txt").getCompressedSize();
System.out.println("CompressedSize: " + compressedSize);

仍然可以使用jar命令获得打包在jar中的文件的大小:

jar tvf Desktop\bar\foo.jar file.txt

输出将为:5 Thu Jun 27 17:36:10 CEST 2019 file.txt
其中5是大小。

您可以在代码中使用它:

Process p = Runtime.getRuntime().exec("jar tvf C:/Users/roberto/Desktop/bar/foo.jar file.txt");
StringWriter writer = new StringWriter();
IOUtils.copy(p.getInputStream(), writer, Charset.defaultCharset());
String jarOutput = writer.toString();  

但是运行jar命令需要jdk。

答案 2 :(得分:0)

这个问题有一些具体的解决方案:How do I list the files inside a JAR file?,特别是自Java 7以来使用FileSystem API。

它应该适用于JAR和解压缩文件中的文件。例如,我不确定它是否适用于WAR中包含的JAR。