获取资源的大小

Osc*_*man 6 java scala

getClass().getResourceAsStream(path)用来读取捆绑资源。

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

getClass().getResource(path).toURI()打包时无法访问它们,因此无法正常工作。

Rob*_*eda 7

我尝试回答这篇文章询问从java中的类路径读取的文件的长度,但他们将其标记为与您的问题重复,所以我在这里给出我的答案!

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

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

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())
Run Code Online (Sandbox Code Playgroud)

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

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

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

jar tvf Desktop\bar\foo.jar file.txt
Run Code Online (Sandbox Code Playgroud)

输出将是:尺寸在 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();  
Run Code Online (Sandbox Code Playgroud)

但运行该命令需要jdk jar


sta*_*tan -1

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

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

  • OP 并不是询问流,而是告诉他“使用 getResourceAsStream(path)”,但需要“在读取之前了解文件大小”。虽然关于一般“InputStream”的答案是正确的,但这不是问题。资源在文件系统或 ZIP 标头中确实有其大小。事实上,这些信息不可用是 API 的一个可悲的缺点。 (7认同)
  • 我有一些 JS 文件和一个 HTML 文件,我希望通过 Netty 提供服务,您建议我如何捆绑这些文件并允许它们通过 HTTP 有效地提供服务?我需要内容长度标头的文件大小。 (2认同)