1

clojure.java.io,有一个io/resource函数,但我认为它只是加载当前正在运行的 jar 的资源。有没有办法指定.jar资源所在的文件?

例如:

  • 我有一个 jar 文件:/path/to/abc.jar
  • abc.jar解压时包含some/text/output.txt在解压目录的根目录中
  • output.txt包含字符串"The required text that I want."

我需要可以执行这些操作的函数:

(list-jar "/path/to/abc.jar" "some/text/")
;; => "output.txt"

(read-from-jar "/path/to/abc.jar" "some/text/output.txt")
;; => "The required text that I want"

提前致谢!

4

1 回答 1

2

根据 Ankur 的评论,我设法拼凑出我需要的功能:

java.util.jar.JarFile对象完成工作。

您可以调用该方法(.entries (Jarfile. a-path))来提供文件列表,而不是返回树结构:

IE:

/目录-1
  /文件-1
  /文件-2
  /目录-2
    /文件-3
  /目录-3
    /文件-4

它返回文件名的枚举:

/dir-1/file-1, /dir-1/file-2, /dir-1/dir-2/file-3, /dir-1/dir-3/file-4

我需要的以下功能定义如下:

(导入 java.util.jar.JarFile)
(defn list-jar [jar-path inner-dir]
  (if-let [jar (JarFile.jar-path)]
    (let [inner-dir (if (and (not= "" inner-dir) (not= "/" (last inner-dir)))
                         (str 内部目录 "/")
                         内部目录)
          条目(枚举序列(.entries jar))
          名称(map (fn [x] (.getName x)) 条目)
          snames (过滤器 (fn [x] (= 0 (.indexOf x inner-dir))) 名称)
          fsnames (map #(subs % (count inner-dir)) snames)]
      fsnames)))

(defn read-from-jar [jar-path inner-path]
  (if-let [jar (JarFile.jar-path)]
    (if-let [entry (.getJarEntry jar inner-path)]
      (slurp (.getInputStream jar 条目)))))

用法:

(从 jar 中读取“/Users/Chris/.m2/repository/lein-newnew/lein-newnew/0.3.5/lein-newnew-0.3.5.jar”
               “莱宁根/new.clj”)

;=> "内置模板列表可以用`lein help new`来显示....."

(list-jar "/Users/Chris/.m2/repository/lein-newnew/lein-newnew/0.3.5/lein-newnew-0.3.5.jar" "leiningen")
;; => (new/app/core.clj new/app/project.clj .....)

于 2012-10-17T05:28:04.120 回答