给定特定路径的jar文件的内容

我有一个名为“san.jar”的jar文件,其中包含各种文件夹,如“类”,“资源”等。比如说,我有一个文件夹结构,如“资源/资产/图像”,其中有各种图像,我没有关于它们的任何信息,如图像名称或文件夹下的图像数量,因为jar文件是私有的,我不允许解压缩jar。

目标:我需要获取给定路径下的所有文件而不迭代整个jar文件。

现在我正在做的是遍历每个条目,每当我遇到.jpg文件时,我都会执行一些操作。 这里只读“资源/资产/图像”,我正在遍历整个jar文件。

JarFile jarFile = new JarFile("san.jar"); for(Enumeration em = jarFile.entries(); em.hasMoreElements();) { String s= em.nextElement().toString(); if(s.contains("jpg")){ //do something } } 

现在我正在做的是遍历每个条目,每当我遇到.jpg文件时,我都会执行一些操作。 这里只读“资源/资产/图像”,我正在遍历整个jar文件。

此代码符合您的目的

 JarFile jarFile = new JarFile("my.jar"); for(Enumeration em = jarFile.entries(); em.hasMoreElements();) { String s= em.nextElement().toString(); if(s.startsWith(("path/to/images/directory/"))){ ZipEntry entry = jarFile.getEntry(s); String fileName = s.substring(s.lastIndexOf("/")+1, s.length()); if(fileName.endsWith(".jpg")){ InputStream inStream= jarFile.getInputStream(entry); OutputStream out = new FileOutputStream(fileName); int c; while ((c = inStream.read()) != -1){ out.write(c); } inStream.close(); out.close(); System.out.println(2); } } } jarFile.close(); 

这可以通过正则表达式更加简洁地完成…当jpg文件具有大写扩展JPG时也可以使用它。

 JarFile jarFile = new JarFile("my.jar"); Pattern pattern = Pattern.compile("resources/assets/images/([^/]+)\\.jpg", Pattern.CASE_INSENSITIVE); for (Enumeration em = jarFile.entries(); em .hasMoreElements();) { JarEntry entry = em.nextElement(); if (pattern.matcher(entry.getName()).find()) { BufferedImage image = ImageIO.read(jarFile .getInputStream(entry)); System.out.println(image.getWidth() + " " + image.getHeight()); } } jarFile.close(); 

使用Java 8和文件系统,现在非常简单,

 Path myjar; try (FileSystem jarfs = FileSystems.newFileSystem(myjar, null)) { Files.find(jarfs.getPath("resources", "assets", "images"), 1, (path, attr) -> path.endsWith(".jpg"), FileVisitOption.FOLLOW_LINKS).forEach(path -> { //do something with the image. }); } 

Files.find将仅搜索所提供的路径,达到所需的深度。

Interesting Posts