支持把单个文件或者文件夹压缩成JAR文件, 支持把单个文件添加到已存在的JAR文件中, 支持读取JAR文件中的任何一个entry.
1. 环境
jdk1.6
2. 代码
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.zip.Deflater;
import java.util.zip.ZipEntry;
import org.apache.log4j.Logger;
public class JarTool {
private static final Integer BUFFER_SIZE = 512;
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(JarTool.class);
/**
* 压缩文件夹及其子文件夹
* @param source String 源文件夹,如: d:/tmp
* @param dest String 目标文件,如: e:/tmp.jar
* @throws IOException
*/
public static void compressFolder(String source, String dest)throws IOException{
JarOutputStream jos = new JarOutputStream(new FileOutputStream(dest));
jos.setLevel(Deflater.BEST_COMPRESSION);
compressJarFolder(jos, new File(source),"");
jos.close();
}
private static void compressJarFolder(JarOutputStream jos, File f, String base)throws IOException{
if(f.isFile()){
compressJarFile(jos, f, base);
}else if(f.isDirectory()){
compressDirEntry(jos, f, base);
String[] fileList = f.list();
for(String file:fileList){
String newSource = f.getAbsolutePath() + File.separator + file;
File newFile = new File(newSource);
String newBase = base + "/" + f.getName()+"/"+newFile.getName();
if(base.equals("")){
newBase = newFile.getName();//f.getName()+"/"+newFile.getName();
}else{
newBase = base + "/" + newFile.getName();
}
logger.info("正在压缩文件从 "+newSource+" 到 "+newBase);
compressJarFolder(jos, newFile, newBase);
}//for
}//if
}
//压缩单个文件
private static void compressJarFile(JarOutputStream jos, File f, String base)throws IOException{
jos.putNextEntry(new ZipEntry(base));
BufferedInputStream bin = new BufferedInputStream(new FileInputStream(f));
byte[] data = new byte[JarTool.BUFFER_SIZE];
while ((bin.read(data)) != -1) {
jos.write(data);
}
bin.close();
jos.closeEntry();
}
public static void compressFile(String sourceFile)throws IOException{
String jarFile = sourceFile.substring(0, sourceFile.lastIndexOf('.')) + ".jar";
compressFile(sourceFile, jarFile);
}
//压缩单个文件到JAR文件中
public static void compressFile(String sourceFile, String jarFile)throws IOException{
File f = new File(sourceFile);
String base = f.getName();
JarOutputStream jos = new JarOutputStream(new FileOutputStream(jarFile));
jos.putNextEntry(new ZipEntry(base));
BufferedInputStream bin = new BufferedInputStream(new FileInputStream(f));
byte[] data = new byte[JarTool.BUFFER_SIZE];
while ((bin.read(data)) != -1) {
jos.write(data);
}
bin.close();
jos.closeEntry();
jos.close();
}
//压缩空文件夹
private static void compressDirEntry(JarOutputStream jos, File f, String base)throws IOException{
jos.putNextEntry(new ZipEntry(base + "/"));
jos.closeEntry();
}
public static byte[] readEntry(String jarFile, String entryName)throws IOException{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
boolean existEntry = readEntry(jarFile, entryName, baos);
if(!existEntry){
return null;
}
return baos.toByteArray();
}
public static boolean readEntry(String jarFile, String entryName, OutputStream os)throws IOException{
JarFile jar = new JarFile(new File(jarFile));
JarEntry entry = jar.getJarEntry(entryName);
if(entry == null){
return false;
}
InputStream is = new BufferedInputStream(jar.getInputStream(entry));
int len = 0;
byte[] b = new byte[1024];
while ((len = is.read(b, 0, b.length)) != -1) {
os.write(b, 0, len);
}
is.close();
return true;
}
public static boolean existsEntry(String jarFile, String entryName)throws IOException{
JarFile jar = new JarFile(new File(jarFile));
JarEntry entry = jar.getJarEntry(entryName);
if(entry == null){
return false;
}
return true;
}
public static String readTextEntry(String jarFile, String entryName, String encoding)throws IOException{
String entryContent = "";
ByteArrayOutputStream baos = new ByteArrayOutputStream();
boolean existEntry = readEntry(jarFile, entryName, baos);
if(!existEntry){
return null;
}
byte[] content = baos.toByteArray();
baos.close();
if(encoding == null){//按平台默认编码
entryContent = new String(content);
}else{
entryContent = new String(content, encoding);
}
return entryContent;
}
public static String readTextEntry(String jarFile, String entryName)throws IOException{
return readTextEntry(jarFile, entryName, null);
}
public static void uncompress(String jarFile)throws IOException{
File f = new File(jarFile);
String path = f.getAbsolutePath();
int index = path.lastIndexOf(".");
if(index > 0){
path = path.substring(0, index);
}
uncompress(jarFile, path);
}
public static void uncompress(String jarFile, String outputDir)throws IOException{
if(!new File(outputDir).exists()){
new File(outputDir).mkdirs();
}
JarFile jar = new JarFile(new File(jarFile));
Enumeration<JarEntry> e = jar.entries();
while(e.hasMoreElements()){
JarEntry entry = e.nextElement();
saveEntry(jar, entry, outputDir);
}
}
private static void saveEntry(JarFile jar, JarEntry entry, String outputDir)throws IOException{
logger.info("解压缩" + entry.getName() + " ... ... ");
File f = new File(new File(outputDir), entry.getName());
if(entry.isDirectory()){
f.mkdirs();
return ;
}else{
f.createNewFile();
}
FileOutputStream fos = new FileOutputStream(f);
InputStream is = new BufferedInputStream(jar.getInputStream(entry));
int len = 0;
byte[] b = new byte[1024];
while ((len = is.read(b, 0, b.length)) != -1) {
fos.write(b, 0, len);
}
is.close();
fos.close();
}
}
3. 测试代码
JarTool.compressFolder("d:\\test", "d:\\test.jar");
JarUtil.jarFile("d:/key.txt");
String text = readTextEntry("d:\\test.jar", "key.txt");
System.out.println(text);
JarTool.uncompress("d:\\test\\test-0.1.0.jar");
分享到:
相关推荐
这个目录可能包含了多个JAR文件,这些文件可能是用来读取、写入或操作Excel文件的库。常见的有Apache POI、JExcelAPI、Aspose.Cells等。 2. **添加到项目类路径**:一旦你解压了JAR文件,你需要将它们添加到你的...
但如果在使用第三方库进行文件操作(如Apache Commons IO、Guava等),则需要将对应的JAR文件添加到项目类路径中。例如,Apache Commons IO库提供了许多方便的文件操作工具类,如`org.apache.commons.io.FileUtils`...
JAR文件通常包含了一个或多个类路径、清单文件(MANIFEST.MF)、数字签名等元数据,有助于实现代码的模块化和优化。 在Java编程中,有许多常见的JAR包,它们提供了各种功能: 1. **Apache Commons**:Apache ...
在Java编程环境中,将项目打包成JAR(Java Archive)文件是常见的操作,这有助于代码的分发、存储和执行。"编译jar文件学习用"这个标题表明这是一个用于教学或自我学习如何创建JAR文件的示例。下面我们将详细讨论...
**描述解析:** 描述提到"mysql, oracle和SQLser三大数据库与eclipse的桥梁",意味着这个jar文件包含了这三个主流数据库系统的JDBC驱动,使得开发者可以在Eclipse这样的集成开发环境中方便地进行数据库操作。...
在本案例中,"加密_jar文件_base64"指的是使用Base64编码对`jar`文件进行加密的过程,以增加其安全性,防止未经授权的访问和使用。 首先,我们需要理解Base64是什么。Base64是一种将二进制数据转换为可打印字符的...
`JarFile`类是核心类,它允许我们打开并操作JAR文件。在给定的代码示例中,`JarFileAccess`类展示了如何读取JAR文件中的指定文件并将其复制到目标目录。 1. **创建`JarFile`对象**: 使用`new JarFile()`构造函数...
在Java中,一个可执行JAR文件通常包含一个主类,这个主类包含了程序的入口点,即`main`方法。执行命令是启动可执行JAR的关键,通过指定正确的命令行参数,可以在不同的操作系统上运行这些程序。 Java的JAR文件实际...
【标题】"jar文件管理器 模拟文件管理"是一个基于Java编程语言开发的应用程序,主要目的是实现对文件和文件夹的基本操作。这个系统利用了Java的jar打包技术,将所有必要的类和资源打包成一个可执行的jar文件,使得...
`JarFile`是Java中用于操作jar文件的主要类。首先,你需要创建一个`JarFile`实例,传入jar文件的路径(如果jar文件在类路径中,可以使用类的全限定名)。一旦有了`JarFile`对象,你可以通过它的`entries()`方法获取...
本教程旨在引导初学者了解如何生成可执行的JAR文件,从而掌握Java的基础编程技能。对于初学者而言,掌握如何打包自己的Java程序为一个可执行的JAR文件是非常重要的一步,这不仅有助于程序的分发,还能提升程序的专业...
`jar`命令是Java开发工具的一部分,用于操作JAR文件。基本语法包括: - `cvf`:创建新的JAR文件,c表示创建,v表示详细模式,f表示指定文件名。 - `cmf`:更新已有JAR文件,添加或修改内容,m表示指定MANIFEST...
本项目旨在向开发人员展示如何获取和使用JSTL的jar文件,并演示了如何在Java Web应用程序中有效地利用JSTL标签。 关键技术和内容关键词: JSTL(JavaServer Pages Standard Tag Library) Java Web开发 JSP页面 ...
**jar文件查看工具详解** 在Java开发环境中,`jar`文件是常见的二进制格式,用于打包类文件、资源文件以及元数据。`jar`文件的全称是Java Archive,它是Java平台的标准打包机制,类似于其他编程语言中的库或者DLL...
在这个压缩包中,包含了两个重要的jar文件:net.mindview.util.jar和pets.jar,它们在学习和实践Java编程思想时可能会起到关键作用。 首先,我们来看`net.mindview.util.jar`。这个文件很可能包含了`MindView`公司...
在Java编程语言中,JAR...通过这些方法,开发者可以方便地访问和操作JAR文件内部的文件内容,无论是简单的文本文件还是其他类型的资源。在实际项目中,正确理解和利用这些技术对于有效管理和分发Java应用程序至关重要。
在给定的标题和描述中提到的"jdbc驱动,三个jar文件",指的是为了实现JDBC功能,通常需要引入的三个核心的JAR(Java Archive)文件。这些JAR文件包含了必要的类和接口,使得Java程序能够连接到数据库,执行SQL语句,...
自己写的比较完善的文件操作jar文件,实现了文件/文件夹的一些常用的操作,实现了文件的压缩解压,实现了部分字符串处理…… 资源分不够的朋友 欢迎进盟网〃编程交流中心(群):10939695群中提供下载及源码交流 更多...
将这两个jar文件放在`/WEB-INF/lib/`目录下是遵循了Java Web应用的部署规范。在Java Web应用中,`/WEB-INF/lib/`目录是用来存放所有应用程序依赖的外部库文件的,这些库文件会被自动加入到类路径中,使得应用程序在...
"查看.jar文件工具"是为了帮助开发者和用户更便捷地探索.jar文件内部结构而设计的。这个工具能够让你无需解压就能查看其中的文件列表、读取类文件内容、检查资源文件等,对于理解程序的工作原理和调试问题非常有帮助...