pony

抄袭是一种美德

[原]动态打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(); 
    } 
  } 
}


 

写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(); 
    } 
  } 
}


posted on 2010-02-25 10:30  马森  阅读(1684)  评论(0编辑  收藏  举报

导航