【问题标题】:How to find any file within a Directory of a Zipfile如何在 Zipfile 的目录中查找任何文件
【发布时间】:2019-06-02 01:08:11
【问题描述】:

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

我已经使用 \b, [A-Za-z-0-9]* 进行了几次正则表达式尝试,但我不断收到 NullPointerException。我研究了使用带有文件名的正则表达式的解决方案,但不是 ZipFile 和 ZipEntry 类的真正案例。目前,这是我目前使用正则表达式的方法。 (有时正则表达式让我头晕目眩。)

public void createAPKList() throws ZipException, IOException {
    apkFileList =  new File("C:/eclipse/workspace/Appium-Side-Project/APKDir/APKFiles").listFiles();
    System.out.println(apkFileList[apkFileList.length-1].getPath());
    apkInstallOptions = storeAndSortFiles(apkFileList, apkInstallOptions);
}


private HashMap<String, File> storeAndSortFiles(File[] fileList, HashMap<String, File> storageList) throws ZipException, IOException{
    ZipFile apkDetails;
    //Example of calling specific ABI 
    String aBI = "armeabi-v7a/";
    String patternStr = "^lib/"+aBI+"[(.*)].so$";
    for(File apk : fileList) {

        //how to initialize ZipEntry to assign the any file that ends with ".so" ?
        apkDetails = new ZipFile(apk);
        ZipEntry readFolders = apkDetails.getEntry(patternStr);
        System.out.println(readFolders.getName().startsWith("lib/armeabi-v7a/"));

    }
    return storageList;
}

当前的解决方案给出了 NullPointerException,因为 ZipEntry 值为空。我不确定错误是来自我的正则表达式还是表达式正在工作,但对于目录中存在多个“.so”的情况。是否可以在 ZipFile/ZipEntry 中使用正则表达式?

【问题讨论】:

    标签: java regex file zipfile


    【解决方案1】:

    一句话:没有。

    不支持模式,事实上documentation 中没有任何内容暗示允许模式。您必须遍历ZipFile中的all entries,并检查每个是否匹配:

    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.
        }
    }
    

    有句老话,当一个人决定用正则表达式解决一个问题时,就会从一个问题变成两个问题。如果不需要,最好不要使用正则表达式。在您的情况下,startsWithendsWith 就足够了。

    我不确定您是否需要对匹配的条目进行处理,或者您是否只想检查它们是否存在。如果是后一种情况,您可以使用Stream 简化代码:

    boolean hasMatchingEntries =
        apiDetails.stream().map(ZipEntry::getName).anyMatch(
            name -> name.startsWith("lib/armeabi-v7a/") && name.endsWith(".so"));
    

    【讨论】:

    • 其实后一种情况是我检查Lib目录时要找的。使用 Stream 适用于我想要对代码执行的操作。感谢您提供不同的观点。
    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2016-09-30
    • 2018-07-29
    相关资源
    最近更新 更多