zoukankan      html  css  js  c++  java
  • Java_文件夹分割与合并

    一.思路:

      1.文件切割:

        使用类RandomAccessFile ,其中方法seek可以自定义读取位置,读一段,通过字节输出流(我使用BufferedOutputStream)写一段

      2.文件合并

        读取多个文件写入一个文件,读取使用字节输入流(BufferedInputStream),输出使用字节输出流就可以(BufferedOutputStream)

        我使用的流

        RandomAccessFile raf=new RandomAccessFile (fSrc,"r");
    
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(new File(this.list.get(i))));  
    
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream(new File(fileName))); 
    
        BufferedOutputStream raf=new BufferedOutputStream(new FileOutputStream(new File("D://destdir//HugeCHM.rar"),true),1024);

    二.代码:

            1.文件切割代码

      
    package com.ahd.util;
    
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.util.ArrayList;
    import java.util.List;
    
    /***
     * 文件切割
     * @author Administrator
     *
     */
    public class FileSplit {
        /***
         * 定义,初始化参数
         */
        private File fSrc=null;
        //目标文件夹地址
        private static File fDest=new File("D://destdir");
        //默认是1024 切割后文件大小
        private int blockSize;
        //切割块数
        private int blockNumber;
        //源文件大小
        private int size;
        //存储切割后文件名称
        private List<String> list;
    
        /***
         * 定义构造方法
         */
        private FileSplit() {
            super();
            list=new ArrayList<String>();
        }
        public FileSplit(File fSrc, File fDest) {
            this(fSrc,fDest,1024);
        }
        public FileSplit(File fSrc, int blockSize) {
            this(fSrc,fDest,blockSize);
        }
        public FileSplit(String strSrc, String destSrc) {
            this(strSrc,destSrc,1024);
        }
        public FileSplit(String strSrc, String destSrc,int blockSize) {
            this(new File(strSrc),new File(destSrc),blockSize);
        }
        public FileSplit(File fSrc, File fDest, int blockSize) {
            this();
            this.fSrc = fSrc;
            this.fDest = fDest;
            this.blockSize = blockSize;
            init();
        }
    
    
        /***
         * 初始化
         */
        public void init(){
            //增加健壮性
            if(!fSrc.exists()||fSrc==null){
                return;
            }
            if(this.blockSize>fSrc.length()){
                this.blockSize=(int) fSrc.length();
            }
            this.size=(int) fSrc.length();
            this.blockNumber=(int) Math.ceil(size*1.0/blockSize);
            initList();
        }
        /***
         * 初始化List
         */
        public void initList(){
            String pathName=fSrc.getName();
            for(int i=0;i<this.blockNumber;i++){
                list.add(fDest.getAbsolutePath()+"/"+pathName+".part"+i);
            }
        }
        
        
        /***
         * 分割split
         * @throws IOException 
         */
        public void split() throws IOException{
            long beginPos=0;
            for(int i=0;i<this.blockNumber;i++){
                splitDetail(i,beginPos,this.blockSize);
            }
        }
        //详细切割步骤
        private void splitDetail(int i, long beginPos, int blockSize) throws IOException {
            //创建流
                    RandomAccessFile raf=new RandomAccessFile (fSrc,"r");
                    BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(new File(this.list.get(i))));
                    //文件操作
                    byte []b=new byte[1024];
                    int len=0;
                    raf.seek(beginPos);
                    while(-1!=(len=raf.read(b))){
                        if(blockSize>len){
                            bos.write(b, 0, len);
                            blockSize-=len;
                        }else{
                            bos.write(b,0,blockSize);
                        }
                        bos.flush();
                    }
                    //释放流
                    bos.close();
                    raf.close();
        }
    }
    文件切割

      2.文件合并主要代码(可以与切割代码放到一起使用)

      
    public void fileMerge() throws IOException{
            for(int i=0;i<blockNumber;i++){
                MergeDetail(i,list.get(i));
            }
        }
        private void MergeDetail(int i, String fileName) throws IOException {
            // TODO Auto-generated method stub
            //选择流
            BufferedInputStream bis=new BufferedInputStream(new FileInputStream(new File(fileName)));
            BufferedOutputStream raf=new BufferedOutputStream(new FileOutputStream(new File("D://destdir//HugeCHM.rar"),true),1024);
            
            //文件操作
            int len=0;
            byte []b=new byte[1024];
            while(-1!=(len=bis.read(b))){
                raf.write(b);
            }
            raf.close();
            bis.close();
        }
    文件合并
  • 相关阅读:
    cocos2d-x 团队碰面有感
    2014年3月份 月会
    2014年特种兵训练营感想
    web 的简单框架
    【实用小技巧】virtual box 虚拟机复制
    flash的Socket通讯沙箱和安全策略问题
    Codeforces Round #237 (Div. 2)
    类的静态常量数组初始化
    关于自己的成长计划
    Android
  • 原文地址:https://www.cnblogs.com/aihuadung/p/9375373.html
Copyright © 2011-2022 走看看