分享
 
 
 

Jar文件内容分析的简单算法; (Nested Jar in War file or a directory)

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

/*

* @(#) JarFileReader.java 1.00 2004/09/20

*

* (c) Copyright 2004 OPENSOURCE ORGANIZATION

*

* FILENAME : JarFileReader.java

* PACKAGE : org.opensource.study.jar

* CREATE DATE : 2004/09/20

* AUTHOR : Humx ([url=mailto:humx_hn@hotmail.com]humx_hn@hotmail.com)

* MODIFIED BY :

* DESCRIPTION : a class read all entry from certain file

* you are free to use and modify it.

*/

package org.opensource.study.jar.util;

import java.io.IOException;

import java.io.File;

import java.io.InputStream;

import java.io.BufferedInputStream;

import java.io.OutputStream;

import java.io.BufferedOutputStream;

import java.io.FileOutputStream;

import java.io.FileWriter;

import java.util.Enumeration;

import java.util.Map;

import java.util.HashMap;

import java.util.Set;

import java.util.HashSet;

import java.util.Iterator;

import java.util.jar.JarEntry;

import java.util.jar.JarFile;

/**

* a simple class to read entry from jar file or directory

* default it will read the entries from the nested jar | war file,

* you can this behavior by setRecursive(false), all the entry will

* be in a set.<br>

* <b>Attention:</b> the duplicated entry name will ignored.

* @author Hu mingxin

* @version 1.0

*/

public final class FileReader {

private Set suffix = null;

/**

* default constructor without argument,

* default, the file with suffix: ".jar" and ".war" will

* be read out recursively

*/

public FileReader() {

suffix = new HashSet();

suffix.add(".jar");

suffix.add(".war");

}

/**

* specifies the suffix of the file

* @param suffix the set contains the suffix of the zip file

* which should be uncompress and analyse, it means this

* process is done recursively, the entry in the set should

* be String instance.<br>

* for example:<br>

* zipSet = {".jar", ".war"};

*/

public FileReader(Set suffix) {

this.suffix = suffix;

}

/**

* read all the entries in the file, file may be a jar | war file

* or a directory, you can set the suffix of the file which one in

* the directory or jar | war file should be read recursively

* @param file the file or directory you want to process

* @return set it contains all the entries in the directory or jar

* file, maybe include entries from the nested jar | war files.

* @throws java.io.IOException if an I/O error has occurred

* @see #FileReader(Set suffix)

*/

public Set read(File file) throws IOException {

Set entries = new HashSet();

read(file, entries, false);

return entries;

}

/**

* comparatively, this method has a parameter surface, if false,

* this method's behavior is the same to read(File file).

* on the contrary, the returned set ony contain the entries of

* the surface. if it's a directory, all files in it will be scaned

* recursively; jar | war file will only list the entry in this zip

* file, if there are jar | zip file entries, they will not be read

* recursively

* @param file the file or directory you want to process

* @return set it contains all the entries in the directory or jar

* file, if surface is true, entries nested jar | war file will

* not be contained

* @throws java.io.IOException if an I/O error has occurred

* @see #read(File file)

*/

public Set read(File file, boolean surface) throws IOException {

if (surface) {

// if file is a directory, all entries should be

// read out but only jar | war file name is traced

Set entries = new HashSet();

if (file.isDirectory()) {

read(file, entries, true);

} else {

JarFile jarFile = new JarFile(file);

read(jarFile, entries, false);

}

return entries;

}

return read(file);

}

/**

* read the entries into entrySet of certain File

* @param file the file you analyse

* @param entrySet the set of the entries

* @param ignoreJar if true when jar | war file is encountered

* only the entry name of it will be add into the set.

* otherwise, jar | war entry will be retrieved recresively

* @throws java.io.IOException if an I/O error has occurred

*/

private void read(File file, Set entrySet, boolean ignoreJar)

throws IOException {

String name = file.getName();

if (file.isDirectory()) {

File[] files = file.listFiles();

for (int i = 0; i < files.length; i++) {

read(files[i], entrySet, ignoreJar);

}

} else if (isRecursiveZip(name) && !ignoreJar) {

JarFile entry = new JarFile(file);

read(entry, entrySet, true);

} else {

entrySet.add(file.getPath());

}

}

/**

* read the entries into entrySet of certain JarFile

* @param jarFile the jarFile you care about

* @param entrySet the set of the entries

* @param recursive if true, the entries in the nested jar | war

* file will also be retrieved and added into entrySet

* @throws java.io.IOException if an I/O error has occurred

*/

private void read(JarFile jarFile, Set entrySet, boolean recursive)

throws IOException {

for (Enumeration e = jarFile.entries(); e.hasMoreElements(); ) {

JarEntry jarEntry = (JarEntry)e.nextElement();

if (jarEntry.isDirectory()) {

continue;

}

String entryName = jarEntry.getName();

if (isRecursiveZip(entryName) && recursive) {

JarFile innerJarFile = getJarFile(jarFile, jarEntry);

read(innerJarFile, entrySet, recursive);

} else {

if (!entrySet.add(entryName)) {

// a duplicated entry [" + entryName + "] has been ignored";

}

}

}

}

/**

* get teh JarFile reference from the entry[jar | war] from centain

* JarFile, in other words, the inner jar | war file are uncompressed

* and it's reference is returned

* @param jarFile the jarFile you analyse

* @param jarEntry the zip entry of the jarFile

* @return jarEntry's JarFile reference

* @throws java.io.IOException if an I/O error has occurred

*/

private JarFile getJarFile(JarFile jarFile, JarEntry jarEntry)

throws IOException {

// read jar entry into a byte array

InputStream in = new BufferedInputStream(jarFile.getInputStream(jarEntry));

// write these bytes into a file

File temporary = File.createTempFile("clazzjarfile", ".jar");

OutputStream out = new BufferedOutputStream(new FileOutputStream(temporary));

int len;

byte[] buf = new byte[1024];

while ((len = in.read(buf)) > 0) {

out.write(buf, 0, len);

}

// release resource

out.flush();

out.close();

in.close();

// analyse the temporary file

return new JarFile(temporary);

}

/**

* if a file is a jar | war file, we should care about

* @param name the file's name

* @return if the file has a suffix contained in suffix

* true is return, else false

*/

private boolean isRecursiveZip(String name) {

if (suffix == null) {

return false;

}

for (Iterator i = suffix.iterator(); i.hasNext(); ) {

if (name.endsWith(i.next().toString())) {

return true;

}

}

return false;

}

}

// TODO this FileReader will generated a lot of temporary jar file, perhaps

// we should clean up all of them; 2004-9-23 07:50:15

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有