• 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
  • 相关阅读:
    ini_set /ini_get函数功能-----PHP
    【转】那个什么都懂的家伙
    word 2007为不同页插入不同页眉页脚
    August 26th 2017 Week 34th Saturday
    【2017-11-08】Linux与openCV:opencv版本查看及库文件位置等
    August 25th 2017 Week 34th Friday
    August 24th 2017 Week 34th Thursday
    August 23rd 2017 Week 34th Wednesday
    August 22nd 2017 Week 34th Tuesday
    August 21st 2017 Week 34th Monday
  • 原文地址:https://www.cnblogs.com/yihaifutai/p/6752012.html
Copyright © 2020-2023  润新知