`
julylin
  • 浏览: 49756 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

一个检查ZIP格式增量包的小工具

    博客分类:
  • J2EE
阅读更多
公司增量太多 为了保证质量 提高效率 开发了一个增量包检查工具
主要功能是搜索ZIP增量包里的所有文件 看是否有相应XML里配置的违规文件和检查.CLASS文件的JDK版本
main:
package main;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * @author july
 * 
 */
public class Files {

	/**
	 * @return
	 */
	public void getFrame() {
		JFrame frame = new JFrame();
		JPanel pane = new JPanel();
		frame.setLayout(null);
		pane.setLayout(null);

		// 窗口位置调整
		frame.setSize(800, 500);
		int windowWidth = frame.getWidth(); // 获得窗口宽
		int windowHeight = frame.getHeight(); // 获得窗口高
		Toolkit kit = Toolkit.getDefaultToolkit(); // 定义工具包
		Dimension screenSize = kit.getScreenSize(); // 获取屏幕的尺寸
		int screenWidth = screenSize.width / 2; // 获取屏幕的宽
		int screenHeight = screenSize.height / 2; // 获取屏幕的高
		frame.setLocation(screenWidth - windowWidth / 2, screenHeight
				- windowHeight / 2);// 窗口居中

		JLabel lab1 = new JLabel();
		lab1.setText("文件夹路径:");
		lab1.setBounds(20, 5, 80, 40);

		final JLabel lab2 = new JLabel();
		lab2.setText("检查jdk版本:");
		lab2.setBounds(20, 65, 100, 40);

		String strJdk[] = { "请选择", "jdk1.4", "jdk1.5", "jdk1.6" };
		final JComboBox cb = new JComboBox(strJdk);
		cb.setBounds(20, 100, 230, 30);

		final JTextArea inputTextbox = new JTextArea();
		JScrollPane scrollPane;
		scrollPane = new JScrollPane(inputTextbox);
		inputTextbox.setEditable(true);
		scrollPane.setBounds(2, 180, 790, 275);

		final JTextField zhwb = new JTextField();
		zhwb.setBounds(20, 35, 230, 30);
		zhwb.setEditable(true);

		final JRadioButton r3 = new JRadioButton("查找配置项中文件");
		r3.setBounds(300, 100, 140, 30);
		r3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (r3.isSelected()) {
					cb.setVisible(false);
					lab2.setVisible(false);
				} else {
					cb.setVisible(true);
					lab2.setVisible(true);
				}
			}
		});
		;

		JButton button1 = new JButton("搜索");
		button1.setBounds(360, 35, 60, 30);
		button1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				actionButton(zhwb, inputTextbox, cb, r3);
			}
		});
		final Component cmpt = null;

		JButton chooseButton = new JButton("目录...");
		chooseButton.setBounds(250, 35, 70, 30);
		chooseButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JFileChooser chooser = new JFileChooser();
				chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); // 只显示目录
				chooser.setCurrentDirectory(new File("."));
				int ret = chooser.showOpenDialog(cmpt);
				if (ret == JFileChooser.APPROVE_OPTION) {
					zhwb.setText(chooser.getSelectedFile().getPath());
				}

			}
		});

		pane.add(lab1);
		pane.add(lab2);
		pane.add(r3);
		pane.add(zhwb);
		pane.add(chooseButton);
		pane.add(button1);
		pane.setBounds(0, 0, 600, 180);

		frame.add(cb);
		frame.add(pane);
		frame.add(scrollPane);
		frame.setTitle("增量包检查工具");
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.setVisible(true);
	}

	/**
	 * @param zhwb
	 * @param inputTextbox
	 * @param cb
	 * @param radio
	 * @return
	 * 
	 */
	public void actionButton(JTextField zhwb, JTextArea inputTextbox,
			JComboBox cb, JRadioButton radio) {
		String strMassage = "此文件夹下无相应文件";
		if ("".equals(zhwb.getText())) {
			strMassage = "请选择文件夹";
		} else if (cb.getSelectedItem().toString().equals("请选择")
				&& radio.isSelected() == false) {
			strMassage = "请选择查找类型(JDK版本或者文件)";
		}
		if (!"".equals(zhwb.getText())
				&& (!cb.getSelectedItem().toString().equals("请选择") || radio
						.isSelected() == true)) {
			String str = new FilesService().search(zhwb.getText(), cb
					.getSelectedItem().toString(), radio.isSelected(), cb
					.getSelectedItem().toString());
			if (str.equals("")) {
				if (radio.isSelected() == true) {
					strMassage = "此文件夹下无相应文件";
				} else {
					strMassage = "此文件夹下无相应CLASS文件";
				}
			} else {
				strMassage = str;
			}
		}
		inputTextbox.setText(strMassage);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new Files().getFrame();
	}
}


逻辑处理:
package main;

import java.io.File;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * @author july
 * 
 */
public class FilesService {
	/**
	 * @param filesUrl
	 * @param jdkVersion
	 * @param boolRadio
	 * @param radioText
	 * @return
	 * 
	 */
	public String search(String filesUrl, String jdkVersion, boolean boolRadio,
			String radioText) {
		String str = "此文件夹下无相应文件";
		if (boolRadio) {
			str = this.getFileNameList(filesUrl);
		} else {
			str = this.getSearchJdkResult(jdkVersion, filesUrl, radioText);
		}
		return str;
	}

	/**
	 * 返回要检查的文件集合
	 * 
	 * @param filesUrl
	 * 
	 * @return
	 */
	public String getFileNameList(String filesUrl) {
		StringBuffer strFileresult = new StringBuffer("");
		String strFileUrl = new File("").getAbsolutePath() + "\\FileName.xml";
		SAXReader saxReader = new SAXReader();
		Document document;
		String strReuselt = "";
		try {
			document = saxReader.read(new File(strFileUrl));
			Iterator<?> iter = document.selectNodes("//file-name").iterator();
			while (iter.hasNext()) {
				strReuselt = "";
				Element elm = (Element) iter.next();
				strReuselt = this.getSearchResult(elm.getText(), filesUrl);
				strFileresult.append(strReuselt);
				if (!"".equals(strReuselt)) {
					strFileresult.append("\n");
				}
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		return strFileresult.toString();
	}

	/**
	 * 返回查找结果
	 * 
	 * @param fileName
	 * @param filesUrl
	 * @param FilesUrl
	 * @return
	 */
	public String getSearchResult(String fileName, String filesUrl) {
		ZipFile zip = null;
		String strFileResult = "";
		StringBuffer strSearchResult = new StringBuffer("");
		File[] entriesFile = new File(filesUrl).listFiles();
		for (int i = 0; i < entriesFile.length; i++) {
			if (entriesFile[i].getName().indexOf(".zip") > 0
					|| entriesFile[i].getName().indexOf(".ZIP") > 0) {
				try {
					zip = new ZipFile(entriesFile[i]);
					Enumeration<? extends ZipEntry> entries = zip.entries();
					while (entries.hasMoreElements()) {
						strFileResult = "";
						ZipEntry entry = entries.nextElement();
						String strName = "";
						if (!entry.isDirectory()) {
							if (entry.getName().indexOf("\\") < 0) {
								strName = entry.getName();
							} else {
								strName = entry.getName().substring(
										entry.getName().lastIndexOf("\\") + 1,
										entry.getName().length());
							}
							if (strName.equals(fileName)) {
								strFileResult = fileName + "文件" + "存在于"
										+ entriesFile[i].getName() + "中\n";
							}
						}
						strSearchResult.append(strFileResult);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return strSearchResult.toString();
	}

	/**
	 * 
	 * @param jdkVersion
	 * @param filesUrl
	 * @param radioText
	 * @param fileName
	 * @param FilesUrl
	 * @return
	 */
	public String getSearchJdkResult(String jdkVersion, String filesUrl,
			String radioText) {
		ZipFile zip = null;
		StringBuffer strFileResult = new StringBuffer("");
		File[] entriesFile = new File(filesUrl).listFiles();
		for (int i = 0; i < entriesFile.length; i++) {
			if (entriesFile[i].getName().indexOf(".zip") > 0
					|| entriesFile[i].getName().indexOf(".ZIP") > 0) {
				try {
					zip = new ZipFile(entriesFile[i]);
					Enumeration<? extends ZipEntry> entries = zip.entries();
					while (entries.hasMoreElements()) {
						ZipEntry entry = entries.nextElement();
						if (!entry.isDirectory()) {
							if (entry.getName().indexOf(".class") > 0) {
								InputStream fis = zip.getInputStream(entry);
								int length = fis.available();
								byte[] data = new byte[length];
								fis.read(data);
								fis.close();
								if (parseFile(data, jdkVersion)) {
									strFileResult.append("使用" + radioText
											+ "编译的CLASS文件存在于:" + zip.getName()
											+ "\n");
									break;
								}
							}
						}
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return strFileResult.toString();
	}

	/**
	 * @param data
	 * @param jdkVersion
	 * @return
	 */
	private static boolean parseFile(byte[] data, String jdkVersion) {
		int minor_version = ((data[4]) << 8) + data[5];
		int major_version = ((data[6]) << 8) + data[7];
		String strVersion = major_version + "." + minor_version;
		if ("46.0".equals(strVersion)) {
			if (jdkVersion.equals("jdk1.4")) {
				return true;
			}
		}
		if ("49.0".equals(strVersion)) {
			if (jdkVersion.equals("jdk1.5")) {
				return true;
			}
		}
		if ("50.0".equals(strVersion)) {
			if (jdkVersion.equals("jdk1.6")) {
				return true;
			}
		}
		return false;
	}
}

分享到:
评论

相关推荐

    Android增量更新工具包.zip

    在这个"Android增量更新工具包.zip"中,可能包含了实现这一功能的相关组件和文档。 在Android开发中,实现增量更新的常见工具有APK Split、AAB(Android App Bundle)和各种第三方库。APK Split允许开发者根据设备...

    android增量更新.zip

    在Android增量更新中,我们可以先将新版本的应用打成一个zip文件,然后使用bsdiff与用户设备上当前版本的应用进行比较,生成一个只包含变化部分的补丁文件。这个补丁文件会远小于完整的新版本应用,从而显著减少用户...

    增量打包代码

    在【压缩包子文件的文件名称列表】中,"UpdatePackage"可能是一个表示增量更新包的文件名,它可能包含了按照上述步骤打包的所有变更文件。用户在接收这个更新包后,只需要解压并应用到他们的本地副本中,就可以获得...

    用于编程工具的增量解析系统___下载.zip

    这个“用于编程工具的增量解析系统___下载.zip”文件可能包含了一个名为“tree-sitter”的开源项目,这是一个现代的、高效的语法分析库,它能够进行增量解析。 Tree-sitter 是一种基于LL(1)的解析器生成器,它的...

    solr增量更新jar包及配置文件

    `scheduler.jar` 文件很可能是包含了一个任务调度器的Java应用程序,用于安排Solr的定期更新任务。这种调度器可能基于Java的定时任务框架如Quartz或者Spring的TaskScheduler。它的工作原理是按照预设的时间间隔或...

    【第三节】android增量升级之提供服务端代码,整理项目

    `apk.zip`文件可能是一个原始的APK包,用于演示增量升级前后的对比,或者作为生成补丁的输入。 实现Android增量升级的工具有很多,比如阿里巴巴的AndFix、Facebook的DiffUtil以及Google的Instant Run等。其中,...

    gradle-2.4-all.zip工具下载

    Gradle 2.4是该工具的一个较早版本,但即便如此,它依然包含了构建Android应用所需的关键功能。这个压缩包“gradle-2.4-all.zip”提供的是Gradle 2.4的完整发行版,适用于那些需要旧版本兼容性的项目。 描述中提到...

    MiFlash工具教程¥.zip

    固件包通常为.zip格式,解压后会得到一系列的.img文件。 3. 连接设备:使用USB数据线将设备连接到电脑,确保设备已开启USB调试模式,并关闭屏幕锁定。 三、MiFlash工具的使用步骤 1. 启动MiFlash:运行安装好的...

    matlab一种改进的增量奇异值分解算法.zip

    MATLAB 是一个强大的数学计算软件,提供了丰富的数值分析工具,包括对矩阵运算的支持。在 MATLAB 中实现 I-SVD,可以有效地处理大规模数据集,并且能够灵活地适应数据的变化。 I-SVD 的基本思想是将数据矩阵 D 分解...

    数据库备份工具.zip

    在本场景中,我们讨论的是一个名为"数据库备份工具.zip"的压缩包,它包含了用于在Windows环境下进行数据库备份的资源。这个工具利用批处理文件和系统任务计划程序实现定时备份,确保数据的安全性和可恢复性。 ...

    Android 增量更新代码

    这个过程通常需要一个合并工具,例如BsPatch,它能根据补丁文件将旧的APK文件更新为新的版本。BsPatch.zip可能就是这个工具的实现,开发者可以将其集成到Android应用中,执行增量更新的合并操作。 具体实现步骤如下...

    android增量更新demo(完整版).rar

    这个"android增量更新demo(完整版).rar"包含了一个实现增量更新的示例项目,可以帮助开发者理解并实践这一技术。 1. **Android增量更新原理** 增量更新的基本思想是对比新旧两个应用版本的差异,然后只发送这些...

    备份工具(Back4Sure) v3.7.2.zip

    备份可以选择存储在压缩格式(.zip或.7 z)的。 2、还包括一个清理选项,将删除过时的备份文件和设置备份操作的详细日志记录。 Back4Sure不附带一个内置的调度功能,但可以让您在桌面上创建快捷方式,将自动运行...

    T3账套批量备份工具.zip

    每个账套对应一个独立的公司或者业务单位,因此,对于有多家公司或业务的大型企业,可能有多个账套需要管理。 批量备份的优势在于以下几个方面: 1. **效率提升**:传统的方式是一对一地手动备份每个账套,这在...

    Wy定时自动备份小工具 电脑文件备份.zip

    "Wy定时自动备份小工具 电脑文件备份.zip" 提供了一个方便的解决方案,它是一款专为个人电脑用户设计的定时自动备份软件。这款工具允许用户设置定期任务,以自动备份重要的文件和数据,避免因意外丢失或系统故障导致...

    apk差分与合成

    APK差分指的是对比新旧两个APK版本之间的差异,找出仅有的改动部分,然后将这些改动部分合并到旧版本APK上,生成一个较小的增量包。这种方式可以显著减少用户下载更新的大小,提升用户体验,尤其是在移动网络环境下...

    kitty-1.zip

    标题 "kitty-1.zip" 暗示我们正在处理一个名为 "kitty-1" 的压缩文件,其格式为 ZIP。ZIP 是一种常见的文件压缩格式,用于将多个文件或目录打包成一个单一的可下载文件,以节省存储空间和方便传输。然而,由于描述仅...

Global site tag (gtag.js) - Google Analytics