一般我们项目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();
}
}
}