我使用getClass().getResourceAsStream(path)
从包资源阅读。
我怎么能知道读取整个流之前文件的大小?
我不能访问它们getClass().getResource(path).toURI()
时,它的包装,所以这是行不通的。
我使用getClass().getResourceAsStream(path)
从包资源阅读。
我怎么能知道读取整个流之前文件的大小?
我不能访问它们getClass().getResource(path).toURI()
时,它的包装,所以这是行不通的。
当然,你不能查询流的总规模,因为根据定义,它不会使整个文件提供给您。 想弹出你的手在河里的。 你有一块流的,但是你必须把整条河在你的手就知道总量。
在这种情况下,你必须阅读整个文件作为流和计数的大小。 记住,你是在处理类和资源,可能是一个JAR文件或其他类型的压缩资源的一部分。 的类加载器没有提供文件句柄资源在这种情况下,
我试图回答这个岗位要求在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
命令。
这个问题有一些具体的解决方案: 如何列出一个JAR文件里的文件? ,具体地,使用一个文件系统 API自从Java 7。
它应该工作在一个JAR并解压缩文件的文件。 我不知道它会为装在战争中的JAR工作,例如。