[原]动态打jar包程序,可用于手机图片音乐游戏的动态打包
一般我们项目jar包,会使用java自带的jar程序,或者使用IDE如eclipse build.xml,或者ant打包。
有一些情况需要动态打包,如根据客户端的请求,把特有的信息或适配打包到jar中,下面是我写的读写的例子程序,没有添加异常处理和多线程,这个基本和业务相关。
代码如下:
读Jar
package test;
import java.io.FileInputStream;
import java.util.Iterator;
import java.util.jar.Attributes;
import java.util.jar.JarInputStream;
import java.util.jar.Manifest;
import java.util.zip.ZipEntry;
/**
* 读取测试程序
* @author pony
* @blog http://pony.cnblogs.com
* @date 2010-02-24
* 存在问题:entry文件名若使用unicode会出现乱码
*/
public class JarReadTest {
/**
* 写文件到jar包中
* 例子中,读取一个文件,并将这个文件存储到jar包中的文件中
* 同时新建一个新的文件
* @param inputFileName
* @param outputFileName
* @throws Exception
*/
public static void Readjar(String inputFileName) throws Exception {
JarInputStream in = new JarInputStream(new FileInputStream(inputFileName)) ;
Manifest manifest = in.getManifest();
Attributes atts=manifest.getMainAttributes();
//输入所有的manifest信息
Iterator ite=atts.keySet().iterator();
while(ite.hasNext())
{
Object key=ite.next();
System.out.println(key+":"+atts.getValue(key.toString()));
}
ZipEntry entry=null;
while((entry=in.getNextEntry())!=null)
{
//输入每个文件的名称
System.out.println(entry.getName());
byte[] buffer = new byte[1024];
int read;
while((read=in.read(buffer))!=-1)
{//输出文件内容
System.out.println(new String(buffer));
}
in.closeEntry();
}
in.close();
}
public static void main(String[] args) {
try {
Readjar("c:\\打包.jar");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package test;
import java.io.FileInputStream;
import java.util.Iterator;
import java.util.jar.Attributes;
import java.util.jar.JarInputStream;
import java.util.jar.Manifest;
import java.util.zip.ZipEntry;
/**
* 读取测试程序
* @author pony
* @blog http://pony.cnblogs.com
* @date 2010-02-24
* 存在问题:entry文件名若使用unicode会出现乱码
*/
public class JarReadTest {
/**
* 写文件到jar包中
* 例子中,读取一个文件,并将这个文件存储到jar包中的文件中
* 同时新建一个新的文件
* @param inputFileName
* @param outputFileName
* @throws Exception
*/
public static void Readjar(String inputFileName) throws Exception {
JarInputStream in = new JarInputStream(new FileInputStream(inputFileName)) ;
Manifest manifest = in.getManifest();
Attributes atts=manifest.getMainAttributes();
//输入所有的manifest信息
Iterator ite=atts.keySet().iterator();
while(ite.hasNext())
{
Object key=ite.next();
System.out.println(key+":"+atts.getValue(key.toString()));
}
ZipEntry entry=null;
while((entry=in.getNextEntry())!=null)
{
//输入每个文件的名称
System.out.println(entry.getName());
byte[] buffer = new byte[1024];
int read;
while((read=in.read(buffer))!=-1)
{//输出文件内容
System.out.println(new String(buffer));
}
in.closeEntry();
}
in.close();
}
public static void main(String[] args) {
try {
Readjar("c:\\打包.jar");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
写jar
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
/**
* 将目标文件打包的测试程序
* @author pony
* @blog http://pony.cnblogs.com
* @date 2010-02-24
* 存在问题:entry文件名若使用unicode会出现乱码
*/
public class JarWriteTest {
/**
* 写文件到jar包中
* 例子中,读取一个文件,并将这个文件存储到jar包中的文件中
* 同时新建一个新的文件
* @param inputFileName
* @param outputFileName
* @throws Exception
*/
public static void Writejar(String inputFileName, String outputFileName) throws Exception {
//Mainifest是jar包特有的说明文件,不能通过手动编写实现
//它可以帮助你实现META-INF的目录保存了一个叫MANIFEST.MF的文件,记录版本,入口程序等信息
Manifest manifest = new Manifest();
manifest.getMainAttributes().putValue("Manifest-Version", "1.0");
manifest.getMainAttributes().putValue("author", "pony");
manifest.getMainAttributes().putValue("blog", "http://pony.cnblogs.com");
//JarOutputStream和JarInputStream是jar包生成时特有封装stream
File outfile=new File(outputFileName);
JarOutputStream out = new JarOutputStream(new FileOutputStream(outfile),manifest) ;
File f = new File(inputFileName);
/************************将输入文件读取写入jar outputstream中**********************************/
//JarEntry 是jar包目录类
JarEntry entry=new JarEntry(new String("file1".getBytes(),"utf-8"));
//将目录加入到out中
out.putNextEntry(entry);
FileInputStream in = new FileInputStream(f);
byte[] buffer = new byte[1024];
int n = in.read(buffer);
while (n != -1) {
out.write(buffer, 0, n);
n = in.read(buffer);
}
in.close();
out.closeEntry();//关闭目录
//再做一个文件
JarEntry entry2=new JarEntry("文件2");
out.putNextEntry(entry2);
out.write("你好啊!".getBytes());
out.closeEntry();
out.flush();
//注意关闭输出文件流
out.close();
}
public static void main(String[] args) {
try {
Writejar("c:\\1.txt", "c:\\打包.jar");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
/**
* 将目标文件打包的测试程序
* @author pony
* @blog http://pony.cnblogs.com
* @date 2010-02-24
* 存在问题:entry文件名若使用unicode会出现乱码
*/
public class JarWriteTest {
/**
* 写文件到jar包中
* 例子中,读取一个文件,并将这个文件存储到jar包中的文件中
* 同时新建一个新的文件
* @param inputFileName
* @param outputFileName
* @throws Exception
*/
public static void Writejar(String inputFileName, String outputFileName) throws Exception {
//Mainifest是jar包特有的说明文件,不能通过手动编写实现
//它可以帮助你实现META-INF的目录保存了一个叫MANIFEST.MF的文件,记录版本,入口程序等信息
Manifest manifest = new Manifest();
manifest.getMainAttributes().putValue("Manifest-Version", "1.0");
manifest.getMainAttributes().putValue("author", "pony");
manifest.getMainAttributes().putValue("blog", "http://pony.cnblogs.com");
//JarOutputStream和JarInputStream是jar包生成时特有封装stream
File outfile=new File(outputFileName);
JarOutputStream out = new JarOutputStream(new FileOutputStream(outfile),manifest) ;
File f = new File(inputFileName);
/************************将输入文件读取写入jar outputstream中**********************************/
//JarEntry 是jar包目录类
JarEntry entry=new JarEntry(new String("file1".getBytes(),"utf-8"));
//将目录加入到out中
out.putNextEntry(entry);
FileInputStream in = new FileInputStream(f);
byte[] buffer = new byte[1024];
int n = in.read(buffer);
while (n != -1) {
out.write(buffer, 0, n);
n = in.read(buffer);
}
in.close();
out.closeEntry();//关闭目录
//再做一个文件
JarEntry entry2=new JarEntry("文件2");
out.putNextEntry(entry2);
out.write("你好啊!".getBytes());
out.closeEntry();
out.flush();
//注意关闭输出文件流
out.close();
}
public static void main(String[] args) {
try {
Writejar("c:\\1.txt", "c:\\打包.jar");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}