【发布时间】:2011-03-24 12:31:41
【问题描述】:
我正在尝试在clojure中重写sn-p,但这一切都很难看,也许有人会提出更优雅的解决方案?
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipFileRdrExp {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("C:\\MyZip.zip");
ZipInputStream zis = new ZipInputStream(fis);
ZipEntry ze;
while((ze=zis.getNextEntry())!=null){
System.out.println(ze.getName());
zis.closeEntry();
}
zis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这是我对 getNextEntry 重复调用的丑陋尝试:
(ns app.core
(:import
(java.io FileInputStream FileNotFoundException IOException File)
(java.util.zip ZipInputStream ZipEntry)))
(defn- read-zip [zip-file]
(let [fis (FileInputStream. zip-file)
zis (ZipInputStream. fis)]
(loop [ze (.getNextEntry zis)]
(when ze
(println (.getName ze))
(.closeEntry zis)
(recur (.getNextEntry zis))))
(.close zis)))
【问题讨论】:
-
有点遗憾的是,您的示例没有明确要求对
ZipEntry的内容做任何事情,只打印条目名称。恕我直言,ZipInputStreamAPI 的更复杂和容易出错的细节是如何检索条目本身的InputStream,如何在条目之间正确迭代,最后如何正确关闭ZipInputStream。这也是不幸的,因为下面的所有答案都以一个简单且不那么令人费解但同时显着不那么有用的解决方案(即阅读内容)。