Java 如何在Zipfile的目录中查找任何文件

Java 如何在Zipfile的目录中查找任何文件,java,regex,file,zipfile,Java,Regex,File,Zipfile,我正在设置一个函数,在其中我收集一个apk文件列表,然后在一个For循环中,我声明一个ZipFile来检查lib文件夹下的ABI目录,方法是检查是否有以“.so”结尾的文件。我能想到的唯一解决方案是使用正则表达式字符串表达式 我已经用\b、[A-Za-z-0-9]*尝试了几次正则表达式,但是我一直得到NullPointerException。我研究了使用带有文件名的正则表达式的解决方案,但没有研究ZipFile和ZipEntry类的实际情况。目前,以下是我目前使用Regex的方法。(有时候正则表

我正在设置一个函数,在其中我收集一个apk文件列表,然后在一个For循环中,我声明一个ZipFile来检查lib文件夹下的ABI目录,方法是检查是否有以“.so”结尾的文件。我能想到的唯一解决方案是使用正则表达式字符串表达式

我已经用\b、[A-Za-z-0-9]*尝试了几次正则表达式,但是我一直得到NullPointerException。我研究了使用带有文件名的正则表达式的解决方案,但没有研究ZipFile和ZipEntry类的实际情况。目前,以下是我目前使用Regex的方法。(有时候正则表达式让我头晕目眩。)

public void createAPKList()抛出ZipException、IOException{
apkFileList=新文件(“C:/eclipse/workspace/Appium-Side-Project/APKDir/APKFiles”).listFiles();
System.out.println(apkFileList[apkFileList.length-1].getPath());
apkInstallOptions=storeAndSortFiles(apkFileList,apkInstallOptions);
}
私有HashMap StoreandSortFile(文件[]文件列表,HashMap存储列表)引发ZipException、IOException{
ZipFile-apkDetails;
//调用特定ABI的示例
字符串aBI=“armeabi-v7a/”;
字符串模式str=“^lib/”+aBI+”[(.*)).so$”;
用于(文件apk:fileList){
//如何初始化ZipEntry以分配任何以“.so”结尾的文件?
apkDetails=新ZipFile(apk);
ZipEntry readFolders=apkDetails.getEntry(patternStr);
System.out.println(readFolders.getName().startsWith(“lib/armeabi-v7a/”);
}
返回存储列表;
}
由于ZipEntry值为null,因此当前解决方案提供了NullPointerException。我不确定错误是来自我的正则表达式还是表达式正在工作,但对于目录中存在多个“.so”的情况。甚至可以在ZipFile/ZipEntry中使用正则表达式吗?

一句话:不可以

不支持模式,事实上,中没有任何内容暗示允许使用模式。您必须在ZipFile中迭代,并检查每个文件是否匹配:

Enumeration<? extends ZipEntry> entries = apkDetails.entries();
while (entries.hasMoreElements()) {
    ZipEntry entry = entries.nextElement();
    String name = entry.getName();
    if (entry.startsWith("lib/armeabi-v7a/") && entry.endsWith(".so")) {
        // Matching entry found.
    }
}

实际上,后一种情况是我在检查Lib目录时所寻找的。使用Stream可以实现我想对代码执行的操作。谢谢你给了我一个不同的视角。
Enumeration<? extends ZipEntry> entries = apkDetails.entries();
while (entries.hasMoreElements()) {
    ZipEntry entry = entries.nextElement();
    String name = entry.getName();
    if (entry.startsWith("lib/armeabi-v7a/") && entry.endsWith(".so")) {
        // Matching entry found.
    }
}
boolean hasMatchingEntries =
    apiDetails.stream().map(ZipEntry::getName).anyMatch(
        name -> name.startsWith("lib/armeabi-v7a/") && name.endsWith(".so"));