`

java Jar 解压压缩 相关代码

阅读更多
package com.mjp.upgrade.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
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.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.apache.commons.io.FileUtils;

public class JarUtils {

/**
* 创建空的临时目录
*
* @return
*/
public static File createTempDirectory() {
final String tmpPath = System.getProperty("java.io.tmpdir");
long current = System.currentTimeMillis();
File tmpDir = new File(tmpPath + File.separator + "patchDir" + current);
if (tmpDir.exists()) {
tmpDir.delete();
return createTempDirectory();
}
tmpDir.mkdirs();
return tmpDir;
}

/**
* 解压jar文件
*
* @param jarFile
*            要解压的jar文件路径
* @param destination
*            解压到哪里
* @throws IOException
*/
public static void unJar(String jarFile, String destination) {
File jar = new File(jarFile);
File dir = new File(destination);
unJar(jar, dir);
}

/**
* 解压jar文件
*
* @param jarFile
*            要解压的jar文件路径
* @param destination
*            解压到哪里
* @throws IOException
*/
public static void unJar(File jarFile, File destination) {
JarFile jar = null;
try {
if (destination.exists() == false) {
destination.mkdirs();
}
jar = new JarFile(jarFile);
Enumeration<JarEntry> en = jar.entries();
JarEntry entry = null;
InputStream input = null;
BufferedOutputStream bos = null;
File file = null;
while (en.hasMoreElements()) {
entry = en.nextElement();
input = jar.getInputStream(entry);
file = new File(destination, entry.getName());
if (entry.isDirectory()) {
file.mkdirs();
continue;
} else {
file.getParentFile().mkdirs();
}
bos = new BufferedOutputStream(new FileOutputStream(file));
byte[] buffer = new byte[8192];
int length = -1;
while (true) {
length = input.read(buffer);
if (length == -1)
break;
bos.write(buffer, 0, length);
}
bos.close();
input.close();
// IOUtils.copy(input, bos);
}

Manifest mf = jar.getManifest();
if (mf != null) {
File f = new File(destination, "META-INF/MANIFEST.MF");
File parent = f.getParentFile();
if (parent.exists() == false) {
parent.mkdirs();
}
OutputStream out = new FileOutputStream(f);
mf.write(out);
out.flush();
out.close();
}

} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (jar != null) {
try {
jar.close();
} catch (Exception e) {
}
}
}
}

public static String convertPackageToPath(String packageName) {
String sep = File.separator;
if (packageName.equals("")) {
return sep;
} else {
return packageName.replace(".", sep) + sep;
}
}

/**
* @param packageName
* @param sourceFile
* @param targetJarFile
*/
public static void addFileToJar(String packageName, File sourceFile,
File targetJarFile) {
try {
File tmpDir = createTempDirectory();
unJar(targetJarFile, tmpDir);
String packagePath = convertPackageToPath(packageName);
File targetFile = new File(tmpDir, packagePath);
if(sourceFile.isDirectory()){
FileUtils.copyDirectoryToDirectory(sourceFile, targetFile);
}else{
FileUtils.copyFileToDirectory(sourceFile, targetFile);
}
jar(targetJarFile, tmpDir);
FileUtils.deleteDirectory(tmpDir);
} catch (Exception ex) {
ex.printStackTrace();
}
}

/**
* @param packageName
* @param sourceFile
* @param targetJarFile
*/
public static void delFileFromJar(String packageName, File sourceFile,
File targetJarFile) {
try {
File tmpDir = createTempDirectory();
unJar(targetJarFile, tmpDir);
String packagePath = convertPackageToPath(packageName);
File targetFile = new File(tmpDir, packagePath);
targetFile = new File(targetFile, sourceFile.getName());
if(targetFile.exists()){
targetFile.delete();
}
jar(targetJarFile, tmpDir);
FileUtils.deleteDirectory(tmpDir);
} catch (Exception ex) {
ex.printStackTrace();
}
}


/**
* 压缩临时文件目录为jar文件 替换jarFile
*
* @param jarFile
*            target
* @param tmpDirectory
*/
public static void jar(File jarFile, File tmpDirectory) {
if (jarFile == null || tmpDirectory == null
|| jarFile.exists() == false || tmpDirectory.exists() == false) {
return;
}
try {
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
jarFile));
BufferedInputStream bis;
List<File> fileList = getAllFiles(tmpDirectory);
for (int i = 0; i < fileList.size(); i++) {
File file = (File) fileList.get(i);
zos
.putNextEntry(new ZipEntry(getEntryName(tmpDirectory,
file)));
if (file.isDirectory()) {
continue;
}
bis = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[8192];
int length = -1;
while (true) {
length = bis.read(buffer);
if (length == -1)
break;
zos.write(buffer, 0, length);
}
bis.close();
// IOUtils.copy(bis, zos);
zos.closeEntry();
}
zos.close();
} catch (Exception ex) {
}
}

public static List<File> getAllFiles(File file) {
List<File> result = new ArrayList<File>();
if (file != null) {
if (file.isDirectory()) {
File[] ls = file.listFiles();
for (File t : ls) {
List<File> tLst = getAllFiles(t);
result.addAll(tLst);
}
} else {
result.add(file);
}
}
return result;
}

/**
* 获得zip entry 字符串
*
* @param base
* @param file
* @return
*/
public static String getEntryName(File baseFile, File file) {
String fileName = file.getPath();
String result = "";
try {
if (baseFile.getParentFile().getParentFile() == null) {
result = fileName.substring(baseFile.getPath()
.length());
} else {
result = fileName.substring(baseFile.getPath()
.length() + 1);
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}

public static void main(String[] args) {
String a = "com.mjp.core.aa";
String b = convertPackageToPath(a);
System.out.println(b);
}

}
==================
以上代码在 linux下运行 打好的 jar ,出问题,原因是没有对 目录entry文件进行处理

以下代码 测试通过:
/**jar -cvf
* @param desJar
* @param jarDir
* @throws Exception
*/
public static void jar(File desJar,File jarDir) throws Exception{
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(desJar));
File[] src = jarDir.listFiles();
jar(out,src);
}

/**
* @param out
* @param src
*/
public static void jar(OutputStream out,File[] src)throws Exception{
jar(out,src,null,null);
}

/**
* @param out
* @param src
*/
public static void jar(OutputStream out,File src)throws Exception{
jar(out,new File[]{src},null,null);
}

/**
* @param out
* @param src
* @param prefix
* @param man
* @throws Exception
*/
public static void jar(OutputStream out,File[] src,String prefix,Manifest man) throws Exception{
JarOutputStream jout = null ;
if (man == null){
jout = new JarOutputStream(out);
}else{
jout = new JarOutputStream(out,man);
}

if(prefix != null && prefix.trim().length() >0 && !prefix.equals("/")){
if(prefix.charAt(0) == '/'){
prefix = prefix.substring(1);
}
if(prefix.charAt(prefix.length() -1) !='/'){
prefix = prefix + "/";
}
}else{
prefix = "";
}
for(File f : src){
jar(f,prefix,jout);
}
jout.close();
}

/**
* @param src
* @param prefix
* @param jout
*/
private static void jar(File src,String prefix,JarOutputStream jout) throws Exception{
if(src.isDirectory()){
prefix = prefix + src.getName() + "/";
ZipEntry entry = new ZipEntry(prefix);
entry.setTime(src.lastModified());
entry.setMethod(JarOutputStream.STORED);
entry.setSize(0l);
entry.setCrc(0l);
jout.putNextEntry(entry);
jout.closeEntry();
File[] files = src.listFiles();
if(files != null){
for(File file : files){
jar(file,prefix,jout);
}
}
}else{
byte[] buffer = new byte[8092];
ZipEntry entry = new ZipEntry(prefix + src.getName());
entry.setTime(src.lastModified());
jout.putNextEntry(entry);
FileInputStream in = new FileInputStream(src);
int len;
while((len = in.read(buffer,0,buffer.length)) != -1){
jout.write(buffer,0,len);
}
in.close();
jout.closeEntry();
}
}




/**jar -xvf
* @param jarFile
* @param unJarDir
*/
public static void unJar(File jarFile,File unJarDir) throws Exception{
BufferedInputStream in = new BufferedInputStream(new FileInputStream(jarFile));
unJar(in,unJarDir);

}

/**
* @param in
* @param unJarDir
*/
public static void unJar(InputStream in,File unJarDir) throws Exception{
if(!unJarDir.exists()){
unJarDir.mkdirs();
}

JarInputStream jin = new JarInputStream(in);
byte[] buffer = new byte[8092];

ZipEntry entry = jin.getNextEntry();
while(entry != null){
String fileName = entry.getName();
if(File.separatorChar != '/'){
fileName = fileName.replace('/', File.separatorChar);
}
if(fileName.charAt(fileName.length() -1 ) == '/'){
fileName = fileName.substring(0,fileName.length() -1);
}
if(fileName.charAt(0)== '/'){
fileName = fileName.substring(1);
}
File file = new File(unJarDir,fileName);
if(entry.isDirectory()){
file.mkdirs();
}else{
File parent = file.getParentFile();
if(!parent.exists()){
parent.mkdirs();
}
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));
int len = 0;
while((len = jin.read(buffer,0,buffer.length)) != -1){
out.write(buffer,0,len);
}
out.flush();
out.close();
file.setLastModified(entry.getTime());
}
jin.closeEntry();
entry = jin.getNextEntry();
}

Manifest mf = jin.getManifest();
if(mf != null){
File file = new File(unJarDir,"META-INF/MANIFEST.MF");
File parent = file.getParentFile();
if(!parent.exists()){
parent.mkdirs();
}
OutputStream out = new FileOutputStream(file);
mf.write(out);
out.flush();
out.close();
}

jin.close();
}



public static void main(String[] args) throws Exception {
File jarF = new File("c:/test/a.jar");
File bjar = new File("c:/test/b.jar");
File unJarDir = new File("c:/test/aa");
unJar(jarF, unJarDir);
jar(bjar,unJarDir);
}


分享到:
评论

相关推荐

    java解压zlib和压缩zlib的jar

    java解压zlib和压缩zlib的jar

    java解压缩zip代码与用到的jar包

    以下是一个基本的Java代码示例,演示如何解压缩ZIP文件: ```java import java.io.*; import java.util.zip.*; public class UnzipExample { public static void unzip(String zipFilePath, String destDirectory...

    java解压和压缩tar包

    本文将详细讲解如何使用Java来解压和压缩tar包,同时解决在处理中文文件名时可能出现的乱码问题,主要关注`javatar-2.5.jar`库中的功能以及`TarUtil.java`类的应用。 首先,`javatar-2.5.jar`是一个专门用于处理tar...

    java解压jar包及示例

    本文将深入探讨如何使用Java实现RAR压缩和解压,以及如何利用提供的jar包(java-unrar-0.3.jar和ant.jar)进行操作,并结合`DeCompressUtil.java`提供的示例代码来理解其实现。 首先,`java-unrar-0.3.jar`是一个...

    java压缩(解压)文件jar包

    Apache的java压缩(解压)文件jar包; jar包的名字有些别扭叫ant.jar

    java 解压jar

    Java 语言提供了多种解压缩 RAR 文件的方法,其中之一是使用 unrar.jar 库。 unrar.jar 库是一个 Java 库,它可以用于解压缩 RAR 文件。使用这个库可以避免使用命令行调用 WinRAR.exe,这可以避免出现解压缩页面和...

    java解压7z用到的jar及解压方法

    这个库为Java提供了与7-Zip交互的API,使我们能够在Java代码中调用7-Zip的解压缩功能。 首先,我们需要导入必要的jar包。"sevenzipjbinding-all-platforms-9.20-2.00beta.jar"是sevenzipjbinding库的核心组件,它...

    java 中 zip压缩文件解压工具类

    本文将深入探讨如何使用Java来处理ZIP文件,特别是针对标题所提及的“java 中 zip压缩文件解压工具类”。我们将讨论核心的Java API,如`java.util.zip`包中的类,并通过一个名为`CompressFileUtils`的工具类来展示...

    java zipentry.jar 解决解压失败问题

    在Java编程中,处理压缩文件,如ZIP格式,是一项常见的任务。然而,当ZIP文件包含中文文件名时,可能会遇到解压失败的问题。...通过遵循这些最佳实践,你可以在Java环境中成功地解压和处理包含非ASCII字符的压缩文件。

    java jar包 ZIp压缩解压 数据库连接驱动 XML解析

    在Java编程领域,有三个关键知识点紧密关联:Java JAR包、ZIP压缩解压和XML解析,以及数据库连接驱动。让我们逐一深入探讨这些主题。 首先,Java JAR(Java Archive)包是Java平台的一种归档格式,用于集合多个类...

    Java压缩及解压tar、tar.z格式文件

    Java压缩及解压tar、tar.z格式文件, 需要apache的包ant-1.7.1.jar 这个自己去搜索下下载

    java操作压缩文件和解压文件实例代码(经测试)

    提供的压缩包包含三个文件:ant.jar(一个用于构建工具的库)、ZipFileList.java(一个包含压缩和解压缩功能的类)和CompressBook.java(可能是一个使用该功能的主程序)。以下是对这些知识点的详细解释: 1. **...

    zip压缩java工具类包含jar文件

    在Java编程环境中,压缩和解压文件是常见的需求,尤其是对于大数据处理和文件传输。`zip`格式是一种广泛使用的文件压缩格式,具有高效且兼容性强的特点。本篇将详细讲解如何利用Java工具类进行`zip`压缩和解压操作,...

    JAVA解压ZIP多层目录文件(需ant.jar

    ### JAVA解压ZIP多层目录文件(需ant.jar) #### 概述 本文将详细介绍一个Java方法,该方法用于解压包含多层目录结构的ZIP文件,并能够支持中文文件名。这种方法利用了Apache Ant库中的`org.apache.tools.zip....

    java 解压和压缩 tar

    在实际应用中,开发者可以使用`javatar-2.5.jar`库和`TarUtil.java`类,通过编写Java代码实现对tar文件的解压和压缩操作。例如,他们可以创建一个简单的命令行工具,接收用户提供的文件路径,然后调用这些方法来执行...

    java解压zip或rar压缩文件(源码和jar包)

    java解压zip或rar压缩文件 包括源码和所需要的jar包:apache ant.jar 和 java-unrar-0.3.jar zip文件解压(要使用apache ant.jar以处理中文乱码) rar文件解压(要使用java-unrar-0.3.jar) 具有处理中文乱码功能 代码...

    利用ant.jar解压缩zip包

    总的来说,利用Apache Ant的ant.jar库,无论是通过Java代码还是Ant构建文件,都能方便、高效地解压缩ZIP文件,而且对于包含中文文件名的情况,它提供了良好的支持。在实际开发中,理解并熟练运用这类工具可以极大地...

    java解压包jar包

    本篇文章将深入探讨如何在Java中解压jar包,以及与之相关的`java unrar 0.3`库的使用。 首先,我们要了解什么是jar包。JAR(Java Archive)文件是Java平台的标准打包格式,它将多个类文件、资源文件和其他元数据...

Global site tag (gtag.js) - Google Analytics