获取资源的大小(Get the size of a resource)

2019-10-29 13:39发布

我使用getClass().getResourceAsStream(path)从包资源阅读。

我怎么能知道读取整个流之前文件的大小?

我不能访问它们getClass().getResource(path).toURI()时,它的包装,所以这是行不通的。

Answer 1:

当然,你不能查询流的总规模,因为根据定义,它不会使整个文件提供给您。 想弹出你的手在河里的。 你有一块流的,但是你必须把整条河在你的手就知道总量。

在这种情况下,你必须阅读整个文件作为流和计数的大小。 记住,你是在处理类和资源,可能是一个JAR文件或其他类型的压缩资源的一部分。 的类加载器没有提供文件句柄资源在这种情况下,



Answer 2:

我试图回答这个岗位要求在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 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();  

但JDK需要运行jar命令。



Answer 3:

这个问题有一些具体的解决方案: 如何列出一个JAR文件里的文件? ,具体地,使用一个文件系统 API自从Java 7。

它应该工作在一个JAR并解压缩文件的文件。 我不知道它会为装在战争中的JAR工作,例如。



文章来源: Get the size of a resource
标签: java scala