[原]动态打jar包程序,可用于手机图片音乐游戏的动态打包

一般我们项目jar包,会使用java自带的jar程序,或者使用IDE如eclipse build.xml,或者ant打包。

有一些情况需要动态打包,如根据客户端的请求,把特有的信息或适配打包到jar中,下面是我写的读写的例子程序,没有添加异常处理和多线程,这个基本和业务相关。

代码如下:

ExpandedBlockStart.gif 读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(); 
    } 
  } 
}


 

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值