如何在Zipfile目录中找到任何文件?

时间:2019-06-02 01:08:11

标签: java regex file zipfile regex-greedy

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

我已经用\ b,[A-Za-z-0-9] *进行了几次正则表达式尝试,但是我一直收到NullPointerException。我研究了使用带有文件名的正则表达式的解决方案,但对于ZipFile和ZipEntry类的案例却并非如此。目前,这是我目前使用Regex的方法。 (有时regex表达式使我头晕。)

(defmacro cons-stream [a b]
  (list 'lazy-seq (list 'cons a (list 'lazy-seq b))))

(defn stream-car [stream] (first stream))

(defn stream-cdr [stream] (rest stream))

(defn stream-map [proc & streams]
  (if (empty? (first streams))
    '()
    (cons-stream (apply proc (map stream-car streams))
                 (apply stream-map proc (map stream-cdr streams)))))

(defn average [a b] (/ (+ a b) 2.0))

(defn sqrt-improve [guess x]
  (average guess (/ x guess)))

(defn sqrt-stream [x]
  (def guesses (cons-stream 1.0
                            (stream-map #(sqrt-improve % x) guesses)))
  guesses)

由于ZipEntry值为null,因此当前解决方案给出NullPointerException。我不确定错误是由于我的regex表达式还是表达式起作用,但是对于目录中存在多个“ .so”的情况。甚至可以在ZipFile / ZipEntry中使用Regex吗?

1 个答案:

答案 0 :(得分: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"));