zoukankan      html  css  js  c++  java
  • javase解归档文件

     1 package com.archiver;
     2 
     3 import java.util.List;
     4 
     5 import org.junit.Test;
     6 
     7 public class ArchiverDemo {
     8     /**
     9      * 测归档
    10      */
    11     @Test
    12     public void testArchive() {
    13         String archFile = "D:\arch\my.xar";
    14         String txt = "D:\a.txt";
    15         String jpg = "E:\迅雷下载\b.jpg";
    16         String ma3 = "E:\迅雷下载\c.mp3";
    17         Archiver ar = new Archiver();
    18         ar.archive(archFile, txt, jpg, ma3);
    19     }
    20 
    21     /**
    22      * 测解档
    23      */
    24     @Test
    25     public void testunArhive() {
    26         String archFile = "D:\arch\my.xar";
    27         Archiver ar = new Archiver();
    28         ar.unArchiver(archFile, "D:\arch\unarch");
    29     }
    30     /**
    31      * 测追加文件
    32      */
    33     @Test
    34     public void testAppendFileToArhive() {
    35         String archFile = "D:\arch\my.xar";
    36         Archiver ar = new Archiver();
    37         ar.appendFile(archFile, "D:\arch\d.jpg");
    38     }
    39 
    40     /**
    41      * 测文档所有内容
    42      */
    43     @Test
    44     public void testArchFileNames() {
    45         Archiver ar = new Archiver();
    46         List<String> list = ar.getAllFileName("D:\arch\my.xar");
    47         for (String string : list) {
    48             System.out.println(string);
    49         }
    50     }
    51 }
      1 package com.archiver;
      2 
      3 import java.io.FileInputStream;
      4 import java.io.FileOutputStream;
      5 import java.io.IOException;
      6 import java.util.ArrayList;
      7 import java.util.List;
      8 
      9 public class Archiver {
     10 
     11     /**
     12      * 把多个文件归档到一个文件中
     13      */
     14     public void archive(String archFile, String... srcFiles) {
     15         for (String srcFile : srcFiles) {
     16             appendFile(archFile, srcFile);
     17         }
     18     }
     19 
     20     /**
     21      * 向归档文件中追加内容
     22      * 
     23      * @param archFile
     24      * @param srcFile
     25      */
     26     public void appendFile(String archFile, String srcFile) {
     27         FileOutputStream fos=null;
     28         FileInputStream fis=null;
     29         try {
     30              fos = new FileOutputStream(archFile, true);
     31             // 1.处理文件名
     32             String fileName = getName(srcFile);
     33             // 1.1 存储文件名长度
     34             byte[] byt = Int2Byte(fileName.length());
     35             fos.write(byt);
     36             // 1.2 文件字节数组
     37             fos.write(fileName.getBytes());
     38             // 2、处理文件内容
     39             fis = new FileInputStream(srcFile);
     40             int count=fis.available();//文件内容长度
     41             //存储文件内容长度
     42             fos.write(Int2Byte(count));
     43             byte[] buff = new byte[1024];
     44             int len = 0;
     45             while ((len = fis.read(buff)) != -1) {
     46                 fos.write(buff, 0, len);
     47             }
     48         } catch (Exception e) {
     49             // TODO Auto-generated catch block
     50             e.printStackTrace();
     51         } finally {
     52             try {
     53                 fis.close();
     54                 fos.close();
     55             } catch (IOException e) {
     56                 // TODO Auto-generated catch block
     57                 e.printStackTrace();
     58             }
     59         }
     60 
     61     }
     62 /**
     63  * 解归档
     64  * @param length
     65  * @return
     66  */
     67     public void unArchiver(String archFile,String destDir){
     68         //FileInputStream fis=null;
     69         //FileOutputStream fos=null;
     70         try {
     71             FileInputStream fis=new FileInputStream(archFile);
     72             //读取文件名长度
     73             byte[] fnameLenBuff=new byte[4];
     74             while((fis.read(fnameLenBuff))!=-1){
     75                 
     76                 int fnameLength=Byte2Int(fnameLenBuff);
     77                 //读取文件名
     78                 byte[] fnameBuf=new byte[fnameLength];
     79                 fis.read(fnameBuf);
     80                 String fname=new String(fnameBuf);
     81                 //读取文件内容长度
     82                 byte[] fcontBuf=new byte[4];
     83                 fis.read(fcontBuf);
     84                 int flen=Byte2Int(fcontBuf);
     85                 //将归档内容写到指定目录处
     86                 FileOutputStream fos=new FileOutputStream(destDir+"\"+fname);
     87                 byte[] buf=new byte[1024];
     88                 int mod=flen % buf.length;
     89                 int count=0;
     90                 
     91                 if(mod==0){
     92                     count=flen/buf.length;
     93                 }
     94                 else{
     95                     count=flen/buf.length+1;
     96                 }
     97                 for(int i=0;i<count;i++){
     98                     //最后一次
     99                     if(i==(count-1)){
    100                         mod=(mod==0?buf.length:mod);
    101                         fis.read(buf, 0, mod);
    102                         fos.write(buf, 0, mod);
    103                         fos.close();
    104                     }
    105                     else{
    106                         fis.read(buf);
    107                         fos.write(buf);
    108                     }
    109                 }
    110             }
    111             fis.close();
    112         } catch (Exception e) {
    113             e.printStackTrace();
    114             // TODO: handle exception
    115         }
    116     }
    117     /**
    118      * 提取归档文件的所有文件名
    119      * @param length
    120      * @return
    121      */
    122         public List<String>  getAllFileName(String archFile){
    123             //FileInputStream fis=null;
    124             //FileOutputStream fos=null;
    125             ArrayList<String> names = new ArrayList<>();
    126             try {
    127                 FileInputStream fis=new FileInputStream(archFile);
    128                 //读取文件名长度
    129                 byte[] fnameLenBuff=new byte[4];
    130                 while((fis.read(fnameLenBuff))!=-1){
    131                     
    132                     int fnameLength=Byte2Int(fnameLenBuff);
    133                     //读取文件名
    134                     byte[] fnameBuf=new byte[fnameLength];
    135                     fis.read(fnameBuf);
    136                     String fname=new String(fnameBuf);
    137                     names.add(fname);
    138                     //读取文件内容长度
    139                     byte[] fcontBuf=new byte[4];
    140                     fis.read(fcontBuf);
    141                     int flen=Byte2Int(fcontBuf);
    142                     //跳过文件内容
    143                     fis.skip(flen);
    144                 }
    145                 fis.close();
    146             } catch (Exception e) {
    147                 e.printStackTrace();
    148                 // TODO: handle exception
    149             }
    150             return names;
    151         }
    152 //整数转为字节数组
    153     private byte[] Int2Byte(int length) {
    154         byte[] a=new byte[4];
    155         a[0]=(byte) (length>>24);
    156         a[1]=(byte) (length>>16);
    157         a[2]=(byte) (length>>8);
    158         a[3]=(byte) (length>>0);
    159         return a;
    160     }
    161     //字节数组转为整数
    162     private int Byte2Int(byte[] by) {
    163         int a1=by[0]<<24;
    164         int a2=(by[1]&0xff)<<16;
    165         int a3=(by[2]&0xff)<<8;
    166         int a4=(by[3]&0xff)<<0;
    167         
    168         return a1|a2|a3|a4;
    169     }
    170     /**
    171      * 获取文件名称
    172      * 
    173      * @param srcFile
    174      * @return
    175      */
    176 private String getName(String srcFilePath) {
    177     String seg = null;
    178     if(srcFilePath.contains("\")){
    179         seg="\";
    180     }
    181     else if(srcFilePath.contains("/")){
    182         seg="/";
    183     }
    184     return srcFilePath.substring(srcFilePath.lastIndexOf(seg)+1);
    185     }
    186 }
    package com.archiver;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Archiver {
    
        /**
         * 把多个文件归档到一个文件中
         */
        public void archive(String archFile, String... srcFiles) {
            for (String srcFile : srcFiles) {
                appendFile(archFile, srcFile);
            }
        }
    
        /**
         * 向归档文件中追加内容
         * 
         * @param archFile
         * @param srcFile
         */
        public void appendFile(String archFile, String srcFile) {
            FileOutputStream fos=null;
            FileInputStream fis=null;
            try {
                 fos = new FileOutputStream(archFile, true);
                // 1.处理文件名
                String fileName = getName(srcFile);
                // 1.1 存储文件名长度
                byte[] byt = Int2Byte(fileName.length());
                fos.write(byt);
                // 1.2 文件字节数组
                fos.write(fileName.getBytes());
                // 2、处理文件内容
                fis = new FileInputStream(srcFile);
                int count=fis.available();//文件内容长度
                //存储文件内容长度
                fos.write(Int2Byte(count));
                byte[] buff = new byte[1024];
                int len = 0;
                while ((len = fis.read(buff)) != -1) {
                    fos.write(buff, 0, len);
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                try {
                    fis.close();
                    fos.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
        }
    /**
     * 解归档
     * @param length
     * @return
     */
        public void unArchiver(String archFile,String destDir){
            //FileInputStream fis=null;
            //FileOutputStream fos=null;
            try {
                FileInputStream fis=new FileInputStream(archFile);
                //读取文件名长度
                byte[] fnameLenBuff=new byte[4];
                while((fis.read(fnameLenBuff))!=-1){
                    
                    int fnameLength=Byte2Int(fnameLenBuff);
                    //读取文件名
                    byte[] fnameBuf=new byte[fnameLength];
                    fis.read(fnameBuf);
                    String fname=new String(fnameBuf);
                    //读取文件内容长度
                    byte[] fcontBuf=new byte[4];
                    fis.read(fcontBuf);
                    int flen=Byte2Int(fcontBuf);
                    //将归档内容写到指定目录处
                    FileOutputStream fos=new FileOutputStream(destDir+"\"+fname);
                    byte[] buf=new byte[1024];
                    int mod=flen % buf.length;
                    int count=0;
                    
                    if(mod==0){
                        count=flen/buf.length;
                    }
                    else{
                        count=flen/buf.length+1;
                    }
                    for(int i=0;i<count;i++){
                        //最后一次
                        if(i==(count-1)){
                            mod=(mod==0?buf.length:mod);
                            fis.read(buf, 0, mod);
                            fos.write(buf, 0, mod);
                            fos.close();
                        }
                        else{
                            fis.read(buf);
                            fos.write(buf);
                        }
                    }
                }
                fis.close();
            } catch (Exception e) {
                e.printStackTrace();
                // TODO: handle exception
            }
        }
        /**
         * 提取归档文件的所有文件名
         * @param length
         * @return
         */
            public List<String>  getAllFileName(String archFile){
                //FileInputStream fis=null;
                //FileOutputStream fos=null;
                ArrayList<String> names = new ArrayList<>();
                try {
                    FileInputStream fis=new FileInputStream(archFile);
                    //读取文件名长度
                    byte[] fnameLenBuff=new byte[4];
                    while((fis.read(fnameLenBuff))!=-1){
                        
                        int fnameLength=Byte2Int(fnameLenBuff);
                        //读取文件名
                        byte[] fnameBuf=new byte[fnameLength];
                        fis.read(fnameBuf);
                        String fname=new String(fnameBuf);
                        names.add(fname);
                        //读取文件内容长度
                        byte[] fcontBuf=new byte[4];
                        fis.read(fcontBuf);
                        int flen=Byte2Int(fcontBuf);
                        //跳过文件内容
                        fis.skip(flen);
                    }
                    fis.close();
                } catch (Exception e) {
                    e.printStackTrace();
                    // TODO: handle exception
                }
                return names;
            }
    //整数转为字节数组
        private byte[] Int2Byte(int length) {
            byte[] a=new byte[4];
            a[0]=(byte) (length>>24);
            a[1]=(byte) (length>>16);
            a[2]=(byte) (length>>8);
            a[3]=(byte) (length>>0);
            return a;
        }
        //字节数组转为整数
        private int Byte2Int(byte[] by) {
            int a1=by[0]<<24;
            int a2=(by[1]&0xff)<<16;
            int a3=(by[2]&0xff)<<8;
            int a4=(by[3]&0xff)<<0;
            
            return a1|a2|a3|a4;
        }
        /**
         * 获取文件名称
         * 
         * @param srcFile
         * @return
         */
    private String getName(String srcFilePath) {
        String seg = null;
        if(srcFilePath.contains("\")){
            seg="\";
        }
        else if(srcFilePath.contains("/")){
            seg="/";
        }
        return srcFilePath.substring(srcFilePath.lastIndexOf(seg)+1);
        }
    }
    View Code
  • 相关阅读:
    JQuery源码解析-Dom加载过程
    多个script标签的作用域
    JQuery源码解析-JQuery的工具方法(1)
    JQuery源码解析-JQuery的工具方法
    JQuery源码解析-JQuery.extend()方法
    JQuery源码解析-添加JQuery的一些方法和属性
    中兴捧月算法精英挑战赛-迪杰斯特拉派
    C语言中的内存相关问题
    动态内存管理
    虚函数与虚继承小结
  • 原文地址:https://www.cnblogs.com/yihaifutai/p/6752012.html
Copyright © 2011-2022 走看看