zoukankan      html  css  js  c++  java
  • [原]动态打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(); 
        } 
      } 
    }


  • 相关阅读:
    ionic 导航
    vscode多光标编辑(MAC)
    vscode保存文件时自动删除行尾空格
    ionic-native sqlite 插件5.x版的在ionic3.x上报错 cannot read property 'split' of undefined
    MAC OSX 自带Apache 配置及使用
    ionic中ion-item下的div,span,p不渲染,应该给这些元素加上item-content属性
    开发ionic + cordova应用时遇到的坑,resources/splash.png do not meet minimum size requirements: 2732x2732
    ionic 创建指令的命名规则
    Soldier and Badges (set的检索简单运用)
    打败大魔王之最小排列数问题(全排列)
  • 原文地址:https://www.cnblogs.com/pony/p/1673224.html
Copyright © 2011-2022 走看看