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

    文件分割与合并

    关闭流的代码(会在下面被调用)

    FileUtil.java

    package cn.Split;
    
    import java.io.Closeable;
    import java.io.IOException;
    
    public class FileUtil {
    /*
     * 工具类关闭流
     * 可变参数:... 只能形参最后一个位置,处理方式与数组一致
     * 
     */
        public static void close(Closeable ... io) {
            for(Closeable temp:io) {
                if(null!=temp) {
                    try {
                        temp.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
        /*
         * 使用泛型方法
         */
        public static <T extends Closeable> void closrAll(T ...io) {
            for(Closeable temp:io) {
                if(null!=temp) {
                    try {
                        temp.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    分割文件代码

    SplitFile.java

    package cn.Split;
    
    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;
    
    public class SplitFile {
        //文件的路径 
        private String filePath;
        //文件名
        private String fileName;
        //文件大小
        private long length;
        //块数
        private int size;
        //每一块的大小
        private long blockSize;
        //每块的名称
        private List<String> blockPath;
        
        public SplitFile() {
            blockPath=new ArrayList<String>();
        }
        public SplitFile(String filePath) {
            this(filePath,1024);
            
        }
        public SplitFile(String filePath,long blockSize) {
            this();
            this.filePath=filePath;
            this.blockSize=blockSize;
            init();
            
        }
        /*
         * 初始化操作,计算块数、确定文件名
         */
        public void init() {
            File src=null;
            //健壮性
            if(null==filePath ||!(((src=new File(filePath)).exists() ))) {
                return;
            }
            if(src.isDirectory()) {
                return ;
            }
            //文件名
            this.fileName=src.getName();
            //计算块数  实际大小与每块大小
            this.length=src.length();
            //修正 每块大小
            if(this.blockSize>length) {
                this.blockSize=length;
            }
            //确定块数
            size=(int)Math.ceil(length*1.0/this.blockSize);
            
        }
        private void initPathName(String destPath) {
            for(int i=0;i<size;i++) {
                this.blockPath.add(destPath+"/"+this.fileName+".part"+i);
            }
        }
        /*
         * 文件分割
         * 1.起始位置
         * 2.实际大小
         * @param destPath  分割文件存放目录
         */
        public void split(String destPath) {
            //确定文件的路径
            initPathName(destPath);
            long  beginPos=0;  //起始点
            long actualBlockSize=blockSize; //实际大小
            
            //计算所有块的大小、位置、索引
            for(int i=0;i<size;i++) {
                if(i==size-1) {   //最后一块
                    actualBlockSize=this.length-beginPos;
                }
                splitDetail(i,beginPos,actualBlockSize);
                beginPos+=actualBlockSize;  //本次的终点,下一次的起点
            }
        }
        /*
         * 文件的分割  输入输出
         * 文件拷贝
         */
        private void splitDetail(int idx,long beginPos,long actualBlockSize) {   //第几个,起始点,实际大小
            //1.创建源
            File src=new File(this.filePath);      //源文件
            File dest=new File(this.blockPath.get(idx));    //目标文件
            //2.选择流
            RandomAccessFile raf=null;      //输入流
            BufferedOutputStream bos=null;  //输出流
            try {
                raf=new RandomAccessFile(src,"r");
                bos=new BufferedOutputStream(new FileOutputStream(dest));
                //读取文件
                raf.seek(beginPos);
                //缓冲区
                byte[]flush=new byte[1024];
                //接收长度
                int len=0;
                while(-1!=(len=raf.read(flush))) {
                    
                    if(actualBlockSize-len>=0) {
                        //写出
                        bos.write(flush,0,len);
                        actualBlockSize-=len;  //剩余量
                    }else { //写出最后一次的剩余量
                        bos.write(flush,0,(int)actualBlockSize);
                        break;
                    }
                    
                }
                
                
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
            finally{
                FileUtil.close(bos,raf);
            }
        }
        
        
        
        public static void main(String[] args) {
            SplitFile split =new SplitFile("C:/Users/Administrator/Desktop/sun/a.txt",1);
            System.out.println(split.size);
            split.split("C:/Users/Administrator/Desktop/sun/s");
            
        }
    }

    效果

    将a.txt文件分割为:

     文件的分割与合并完整代码

    package cn.Split;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.util.ArrayList;
    import java.util.List;
    
    public class SplitFile {
        //文件的路径 
        private String filePath;
        //文件名
        private String fileName;
        //文件大小
        private long length;
        //块数
        private int size;
        //每一块的大小
        private long blockSize;
        //分割后的存放目录
        private String destBlockPath;
        //每块的名称
        private List<String> blockPath;
        
        public SplitFile() {
            blockPath=new ArrayList<String>();
        }
        public SplitFile(String filePath,String destBlockPath) {
            this(filePath,destBlockPath,1024);
            
        }
        public SplitFile(String filePath,String destBlockPath,long blockSize) {
            this();
            this.filePath=filePath;
            this.destBlockPath=destBlockPath;
            this.blockSize=blockSize;
            init();
            
        }
        /*
         * 初始化操作,计算块数、确定文件名
         */
        public void init() {
            File src=null;
            //健壮性
            if(null==filePath ||!(((src=new File(filePath)).exists() ))) {
                return;
            }
            if(src.isDirectory()) {
                return ;
            }
            //文件名
            this.fileName=src.getName();
            //计算块数  实际大小与每块大小
            this.length=src.length();
            //修正 每块大小
            if(this.blockSize>length) {
                this.blockSize=length;
            }
            //确定块数
            size=(int)Math.ceil(length*1.0/this.blockSize);
            //确定文件的路径
            initPathName();
        }
        private void initPathName() {
            for(int i=0;i<size;i++) {
                this.blockPath.add(destBlockPath+"/"+this.fileName+".part"+i);
            }
        }
        /*
         * 文件分割
         * 1.起始位置
         * 2.实际大小
         * @param destPath  分割文件存放目录
         */
        public void split() {
            long  beginPos=0;  //起始点
            long actualBlockSize=blockSize; //实际大小
            
            //计算所有块的大小、位置、索引
            for(int i=0;i<size;i++) {
                if(i==size-1) {   //最后一块
                    actualBlockSize=this.length-beginPos;
                }
                splitDetail(i,beginPos,actualBlockSize);
                beginPos+=actualBlockSize;  //本次的终点,下一次的起点
            }
        }
        /*
         * 文件的分割  输入输出
         * 文件拷贝
         */
        private void splitDetail(int idx,long beginPos,long actualBlockSize) {   //第几个,起始点,实际大小
            //1.创建源
            File src=new File(this.filePath);      //源文件
            File dest=new File(this.blockPath.get(idx));    //目标文件
            //2.选择流
            RandomAccessFile raf=null;      //输入流
            BufferedOutputStream bos=null;  //输出流
            try {
                raf=new RandomAccessFile(src,"r");
                bos=new BufferedOutputStream(new FileOutputStream(dest));
                //读取文件
                raf.seek(beginPos);
                //缓冲区
                byte[]flush=new byte[1024];
                //接收长度
                int len=0;
                while(-1!=(len=raf.read(flush))) {
                    
                    if(actualBlockSize-len>=0) {
                        //写出
                        bos.write(flush,0,len);
                        actualBlockSize-=len;  //剩余量
                    }else { //写出最后一次的剩余量
                        bos.write(flush,0,(int)actualBlockSize);
                        break;
                    }
                    
                }
                
                
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
            finally{
                FileUtil.close(bos,raf);
            }
        }
        
        /*
         * 文件的合并
         */
        public void merge(String destPath) {
            //1、创建源
            File dest=new File(destPath);
            //2、选择流
            BufferedOutputStream bos=null;
            try {
                bos=new BufferedOutputStream(new FileOutputStream(dest,true));  //追加
                BufferedInputStream bis=null;
                for(int i=0;i<this.blockPath.size();i++) {
                        bis=new BufferedInputStream(new FileInputStream(new File(this.blockPath.get(i))));
                        //缓冲区
                        byte[]flush=new byte[1024];
                        //接收长度
                        int len=0;
                        while(-1!=(len=bis.read(flush))) {
                            System.out.println(new String(flush,0,len));
                            bos.write(flush,0,len);
                        }
                        bos.flush();
                        FileUtil.close(bis);
                    }
                  }catch (FileNotFoundException e) {
                        
                        e.printStackTrace();
                    } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }finally {
                    FileUtil.close(bos);
                }
                
            
        }
        
        
        
        public static void main(String[] args) {
            SplitFile split =new SplitFile("C:/Users/Administrator/Desktop/sun/a.txt","C:/Users/Administrator/Desktop/sun/s",1);
    //        System.out.println(split.size);
            split.split();
            split.merge("C:/Users/Administrator/Desktop/sun/s/a.java ");
        }
    }

    效果:

  • 相关阅读:
    Tkinter组件之Entry
    Tkinter组件之LabelFrame
    Tkinter组件之Frame
    Tkinter组件之Radiobutton
    Tkinter 组件详解之Checkbutton
    Tkinter组件之Label
    Tkinter组件之Button
    Tkinter:事件绑定
    特征点匹配方式的选择
    跑通SOLOV1-V2实例分割代码,并训练自己的数据集
  • 原文地址:https://www.cnblogs.com/ssxblog/p/11233984.html
Copyright © 2011-2022 走看看