Java 获取资源的大小

Java 获取资源的大小,java,scala,Java,Scala,我正在使用getClass().getResourceAsStream(path)读取捆绑资源 在读取整个流之前,如何知道文件大小 打包时,我无法使用getClass().getResource(path).toURI()访问它们。因此,这样做不起作用。当然,您无法查询流的总大小,因为根据定义,它不会使整个文件对您可用。想象一下把手伸进河里。你有一条小溪,但你必须把整条河都放在手中才能知道总流量 在这种情况下,您必须以流的形式读取整个文件并计算大小。请记住,您所处理的类和资源可能是JAR文件或其

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

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


打包时,我无法使用
getClass().getResource(path).toURI()
访问它们。因此,这样做不起作用。

当然,您无法查询流的总大小,因为根据定义,它不会使整个文件对您可用。想象一下把手伸进河里。你有一条小溪,但你必须把整条河都放在手中才能知道总流量


在这种情况下,您必须以流的形式读取整个文件并计算大小。请记住,您所处理的类和资源可能是JAR文件或其他压缩资源的一部分。类加载器不必为资源提供文件句柄,在这种情况下

这个问题有一些特定的解决方案:,特别是,从Java 7开始使用API


它应该适用于JAR中的文件和解压文件。例如,我不确定它是否适用于战争中包装的罐子。

我试图回答这篇文章,但他们将其标记为与你的问题重复,所以我在这里给出我的答案

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

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

file.txt
打包在jar中时,
.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();  

但是jdk需要运行
jar
命令。

为什么文件大小很重要?如果它在jar中,很可能会被压缩。
getClass().getResourceAsStream(path).available()
是否返回正确的文件大小?@Buddy,否。
“返回下一次调用方法“
grated,
getClass().getResource>”可以从该输入流[…]读取(或跳过)的字节数的估计值(path).toURI()
不起作用,另一方面,打包应用程序时,您不需要URI,您需要的是资源的大小,那么为什么您关心
.toURI()
是否起作用?
getClass().getResource(path).openConnection().getContentLength()
确实有效。我有几个JS文件和一个HTML文件希望与Netty一起使用,您建议我如何捆绑这些文件并允许它们通过HTTP有效地使用?我需要内容长度标题的文件大小。OP不是询问流,他告诉我他在“使用getResourceAsStream(path)”,但需要“阅读前了解文件大小”。虽然关于一般的
InputStream
的答案是正确的,但这不是问题。资源的大小确实在文件系统或ZIP头中。此信息不可用的事实是API的一个可悲的缺点。