मैं एक फ़ंक्शन सेट कर रहा हूं जहां मैं एपीके फाइलों की एक सूची एकत्र करता हूं, फिर फॉर-लूप के अंदर, मैं lib फ़ोल्डर के तहत एबीआई निर्देशिकाओं की जांच करने के लिए एक ज़िपफाइल तीव्र घोषित करता हूं, यह जांच कर कि कोई फ़ाइल ".so" के साथ समाप्त होती है या नहीं। एकमात्र विकल्प जिसका मैं समाधान कर सकता हूं, वह है रेगेक्स स्ट्रिंग एक्सप्रेशन का उपयोग करना

मैंने \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 में Regex का उपयोग करना भी संभव है?

1
InvisibleExo 2 जून 2019, 04:08

1 उत्तर

सबसे बढ़िया उत्तर

एक शब्द में: नहीं।

पैटर्न समर्थित नहीं हैं, और वास्तव में दस्तावेज़ीकरण जिसका अर्थ है कि एक पैटर्न की अनुमति है। आपको सभी प्रविष्टियां, और जांचें कि क्या प्रत्येक एक से मेल खाता है:

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 पर्याप्त हैं।

मुझे यकीन नहीं है कि आपको मेल खाने वाली प्रविष्टियों के साथ कुछ करने की ज़रूरत है, या यदि आप उनके अस्तित्व की जांच करना चाहते हैं। यदि यह बाद का मामला है, तो आप स्ट्रीम:

boolean hasMatchingEntries =
    apiDetails.stream().map(ZipEntry::getName).anyMatch(
        name -> name.startsWith("lib/armeabi-v7a/") && name.endsWith(".so"));
2
VGR 2 जून 2019, 01:32