我有一个名为“san.jar”的jar文件,其中包含各种文件夹,如“classes”,“resources”等, 比如说,我有一个像“资源/资产/图像”这样的文件夹结构,其中有各种图像,我没有关于它们的任何信息,如图像名称或文件夹下的图像数量,因为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文件。
答案 0 :(得分:0)
此代码符合您的目的
JarFile jarFile = new JarFile("my.jar");
for(Enumeration<JarEntry> 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();
答案 1 :(得分:0)
使用正则表达式可以更简洁地完成...当jpg文件具有大写扩展JPG时,它也可以工作。
JarFile jarFile = new JarFile("my.jar");
Pattern pattern = Pattern.compile("resources/assets/images/([^/]+)\\.jpg",
Pattern.CASE_INSENSITIVE);
for (Enumeration<JarEntry> 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();
答案 2 :(得分:0)
使用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只会搜索提供的路径,达到所需的深度。