在对EJB进行部署的过程中,需要将ejb的jar文件解压缩到一个临时目录下,添加或修改它的基于特定应用服务器的专有部署文件,再将修改后的文件夹打包成jar放到应用服务器上完成整个部署流程。在这里需要用到Java的压缩和解压缩文件操作,其中,解压缩文件的代码如下:

private boolean releaseZipToFile(String source, String outFile) throws IOException{
ZipFile zfile
= new ZipFile(source);
Enumeration zList
= zfile.entries();
ZipEntry ze
= null;
byte[] buf = new byte[1024];
while (zList.hasMoreElements()) {
ze
= (ZipEntry)zList.nextElement();
if (ze.isDirectory()){
continue;
}
OutputStream os
= new BufferedOutputStream(new FileOutputStream(getRealFileName(outFile, ze.getName())));
InputStream is
= new BufferedInputStream(zfile.getInputStream(ze));
int readLen = 0;
while ((readLen = is.read(buf, 0, 1024)) != -1) {
os.write(buf,
0, readLen);
}
is.close();
os.close();
System.out.println(
"Extracted: " + ze.getName());
}
zfile.close();
}

private File getRealFileName(String baseDir, String absFileName) {
String[] dirs
= absFileName.split("/");
File ret
= new File(baseDir);
if (dirs.length > 1) {
for (int i = 0; i < dirs.length - 1; i++) {
ret
= new File(ret, dirs[i]);
}
}
if (!ret.exists()) {
ret.mkdirs();
}
ret
= new File(ret, dirs[dirs.length - 1]);
return ret;
}

原理很简单,就是将压缩文件读入,遇到目录就进入目录,遍历它的每个文件,并且在目标目录中建立相同名称的文件,并将字节从源文件读取写入到目标文件中。压缩文件的代码如下所示:

public void createZip(String sourceDir, String zipFileName) throws Exception {
File folderObject
= new File(sourceDir);
if (folderObject.exists()) {
ArrayList
<File> fileList = getSubFiles(new File(sourceDir));
ZipOutputStream zos
= new ZipOutputStream(new FileOutputStream(zipFileName));
ZipEntry ze
= null;
byte[] buf = new byte[1024];
int readLen = 0;
for (int i = 0; i < fileList.size(); i++) {
File f
= (File)fileList.get(i);
System.out.println(
"Adding: " + f.getPath() + f.getName());
ze
= new ZipEntry(getAbsFileName(sourceDir, f));
ze.setSize(f.length());
ze.setTime(f.lastModified());
zos.putNextEntry(ze);
InputStream is
= new BufferedInputStream(new FileInputStream(f));
while ((readLen = is.read(buf, 0, 1024)) != -1) {
zos.write(buf,
0, readLen);
}
is.close();
System.out.println(
"done...");
}
zos.close();
}
else {
throw new Exception("The folder is not exist");
}
}

private ArrayList<File> getSubFiles(File baseDir) {
ArrayList
<File> ret = new ArrayList<File>();
File[] tmp
= baseDir.listFiles();
for (int i = 0; i < tmp.length; i++) {
if (tmp[i].isFile()) {
ret.add(tmp[i]);
}
if (tmp[i].isDirectory()) {
ret.addAll(getSubFiles(tmp[i]));
}
}
return ret;
}

private String getAbsFileName(String baseDir, File realFileName) {
File real
= realFileName;
File base
= new File(baseDir);
String ret
= real.getName();
while (true) {
real
= real.getParentFile();
if (real == null)
break;
if (real.equals(base))
break;
else {
ret
= real.getName() + "/" + ret;
}
}
return ret;
}

代码首先判断源目录是否存在,然后获得它的文件列表,然后利用压缩目标文件的名称创建一个Zip输出流,将每个文件写到这个流中,从而完成整个压缩工作。