前一篇文章有講JAR的解析。流程很簡單,創建JAR文件,用這個文件構建JarFile,然後,從JarFile中得到JarEntry的枚舉,這樣,就可以遍歷JarEntry,而得到字節流的方法也很簡答,JarFile提供了根據JarEntry獲取字節流的方法。
JarEntry枚舉時,會將JarFile中所有的文件列出來,其路徑爲相對路徑。例如:com/huayu/mtk/Gpio.class
打包的過程是逆向的;JarOutputStream提供了putnextEntry、closeEntry、write方法。
Entry的名稱,很顯然,是相對路徑名。不可能是絕對路徑名,也不可能是文件名(否則,Jar怎麼知道你要寫在哪裏!)
生成Jar文件時,是不需要構建JarFile的(JarFile沒有提供相關的API)。直接構建FileOutputStream和JarOutputStream就夠了。
疑問在於:我需要爲每個文件建立一個Entry,還是需要爲每一個目錄和文件建立一個Entry。
經過測試,Jar採用的是在生成Jar文件時爲每個目錄和文件建立一個Entry的方式;這就有點像我們在創建文件時,如果這個文件所在的目錄不存在,就需要先建立目錄一樣。當然,Jar如果採用另一種方式,我認爲也是合理的。
在網上拷貝了一段代碼,原來的代碼有一個BUG,改了 一下,測試OK;
另外,發現我生成的JAR比Eclipseme生成的JAR文件大1K左右字節。但是,都可以用。原因尚不確定。