上一节我们阅读到了org.jivesoftware.openfire.starter.ServerStarter文件中的第90行,这节继续。
第90行调用unpackArchives(libDir, true);方法。
通过阅读该方法的英文注释大概意思是:转换文件夹中的一些包文件为一个标准的jar文件,在转换jar文件的同时每个被转的包文件就会被删除,如果包文件不存在,那么就什么都不做。
-
过滤文件
带着这句话我们进行阅读。该方法传入了2个参数,第一个是一个lib文件夹,第二个参数是个boolean值true。
File [] packedFiles = libDir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".pack");
}
});
if (packedFiles == null) {
// Do nothing since no .pack files were found
return;
}
以上代码是unpackArchives方法中的146到155行的代码。
上面的第一句话我们大家应该很熟悉,没错,这句话我也经常用,但是我经常用不带参数的方法也就是一般这样用,
File [] packedFiles = libDir.listFiles();
这样是获取到一个文件夹下的所有的文件。
而带参数的根据字面意思大概是过滤文件名称的意思,就是过滤一定规则的文件,而不是显示所有的文件,
过滤用
FilenameFilter
这个接口,一般我们用接口都是通过继承的方法来使用,但是我们现在通过new的方式来使用,其实这种用法还是蛮多的,比如很多注册事件== 很多地方都大量运用了该方法。
但是new接口的时候我们会发现我们就要实现里面所有的方法,少一个方法都不可以。因为FilenameFilter
接口只有一个方法accept
所以我们在new的同时就会实现该方法,我们通过该方法直接过滤以某种后缀名的文件就可以了现在我们要列出.pack类型的文件所以我们应该写
return
name.endsWith(
".pack"
);
就可以获取到了。很方便吧。
通过以上代码我们学习一个知识点,那就是获取某个文件夹下的某种格式的文件列表应该用FilenameFilter
来实现,实现方法是一下代码
File [] packedFiles = libDir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".pack");
}
});
如果没有获取到.pack类型的文件那么什么都不做,直接返回。
-
具体实现把.pack的文件转换为jar文件
上面我们获取到了.pack的文件数据,然后开始遍历该数组,把每个.pack文件转为jar文件。
关键代码如下
InputStream in = new BufferedInputStream(new FileInputStream(packedFile)); JarOutputStream out = new JarOutputStream(new BufferedOutputStream( new FileOutputStream(new File(libDir, jarName)))); Pack200.Unpacker unpacker = Pack200.newUnpacker(); // Print something so the user knows something is happening. if (printStatus) { System.out.print("."); } // Call the unpacker unpacker.unpack(in, out); in.close(); out.close(); packedFile.delete(); unpacked = true;
以上的packedFile
是遍历每个.pack的文件。就这样把.pack文件转为了jar文件。