Как найти любой файл в каталоге Zipfile - PullRequest
1 голос
/ 02 июня 2019

Я настраиваю функцию, в которой я собираю список файлов apk, затем в цикле For я объявляю интенсивный ZipFile для проверки каталогов ABI в папке lib, проверяя, заканчивается ли какой-либо файл на ". так". Единственное решение, о котором я могу подумать, - это использовать регулярные выражения String

Я сделал несколько попыток выражения регулярного выражения с \ b, [A-Za-z-0-9] *, но я получаю исключение NullPointerException. Я исследовал решения для использования регулярных выражений с именами файлов, но на самом деле это не относится к классам ZipFile и ZipEntry. На данный момент, вот мой текущий подход с Regex. (Иногда выражения регулярных выражений заставляют мою голову кружиться.)

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". Можно ли даже использовать Regex в ZipFile / ZipEntry?

1 Ответ

2 голосов
/ 02 июня 2019

Одним словом: Нет.

Шаблоны не поддерживаются, и фактически в документации нет ничего, что подразумевало бы, что шаблон разрешен. Вы должны перебрать все записи в 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.
    }
}

Существует старая поговорка, что когда кто-то решает проблему с помощью регулярных выражений, он переходит от одной проблемы к двум проблемам. Лучше не использовать регулярные выражения, если они вам не нужны. В вашем случае достаточно startsWith и endsWith.

Я не уверен, нужно ли вам что-то делать с соответствующими записями или вы просто хотите проверить их существование. Если это последний случай, вы можете упростить код, используя Stream :

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