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

    package io;
    
    import java.io.*;
    import java.util.Arrays;
    import java.util.Enumeration;
    import java.util.Vector;
    
    /**
     * Created by Lenovo on 2017/11/20.
     */
    public class FileMerge {
        public static void main(String[] args) throws IOException{
            String newPath="C:\Users\Lenovo\Desktop\merge.txt";
            String[] files=new String[2];
            files[0]="C:\Users\Lenovo\Desktop\SVN地址、用户名及密码.txt";
            files[1]="C:\Users\Lenovo\Desktop\idea快捷键.txt";
           // merge(newPath,files);
            File f = new File(files[1]);
            split2(f,500);
        }
        //将多个文件合并成一个文件
        public static void merge(String newPath,String[] files) throws IOException {
            //将文件加入序列流
            Vector<FileInputStream> v = new Vector<>();
            for (String file:files) {
                v.add(new FileInputStream(file));
            }
            Enumeration<FileInputStream> elements = v.elements();
            SequenceInputStream sis = new SequenceInputStream(elements);
            //将序列流读取到文件
            FileOutputStream fos = new FileOutputStream(newPath);
            byte[] bytes = new byte[1024];
            int len=0;
            while((len = sis.read(bytes))!=-1){
                fos.write(bytes,0,len);
            }
            fos.close();
            sis.close();
        }
        //将一个文件拆分成多个文件
    
        //两种思想:一、 一边读流一边写(按照要求)直至全部读完
        public static void split(File srcPath,int eachSize){
            if(srcPath.length() == 0){
                throw  new RuntimeException("该文件不符合规范");
            }
            //将文件读到内存中
            FileInputStream fis=null;
            FileOutputStream fos=null;
            try{
                fis=new FileInputStream(srcPath);
                //写文件
                byte[]bytesnew=new byte[eachSize];
                String filename;
                String[] filePara;
                String srcfilename;
                String prefix;
                int lennew;
                int i=0;
                while ((lennew = fis.read(bytesnew,0,eachSize))!=-1){
                    filePara = srcPath.getName().split("\.");
                    srcfilename = filePara[0];
                    prefix = filePara[1];
                    filename=srcfilename+"-"+i+"."+prefix;
                    //在当前目录下创建新的文件
                    File newfile = new File(srcPath.getParent(),filename);
                    //将源文件流进行拆分写入文件
                    fos = new FileOutputStream(newfile);
                    fos.write(bytesnew,0,lennew);
                    i++;
                }
                fis.close();
                fos.close();
            }catch (Exception e){
                e.printStackTrace();
            }
    
        }
        //二、直接将流全部读到缓存中,将缓存再进行分割,分批写入文件可以用多线程
        public static void split2(File srcPath,int eachSize){
            if(srcPath.length()==0){
                throw  new RuntimeException("该文件不符合规范");
            }
            byte[]bytes=new byte[(int)srcPath.length()];
            FileInputStream fis=null;
            try {
                fis = new FileInputStream(srcPath);
                fis.read(bytes);
                fis.close();
            }catch (Exception e){
                e.printStackTrace();
            }
            //确定将文件拆成分几个文件
            int fileNumber;
            if(bytes.length%eachSize==0){
                fileNumber=bytes.length/eachSize;
            }else{
                fileNumber=bytes.length/eachSize+1;
            }
            //将缓存分批写入文件
            String filename;
            String[] filePara;
            String srcfilename;
            String prefix;
            for(int i=0;i<fileNumber;i++){
                filePara = srcPath.getName().split("\.");
                srcfilename = filePara[0];
                prefix = filePara[1];
                filename=srcfilename+"_"+i+"."+prefix;
                //在当前目录下创建新的文件
                File newfile = new File(srcPath.getParent(),filename);
                byte[] currentbytes;
                if(i != fileNumber-1){
                    currentbytes = Arrays.copyOfRange(bytes,eachSize*i,eachSize*(i+1));
                }else{
                    currentbytes = Arrays.copyOfRange(bytes,eachSize*i,bytes.length);
                }
                try{
                    FileOutputStream fos = new FileOutputStream(newfile);
                    fos.write(currentbytes);
                    fos.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
    
            }
    
        }
    
    }
  • 相关阅读:
    python连接SMTP的TLS(587端口)发邮件python发邮件(带认证,587端口)202010
    JAVA抓取通过JS渲染的网站(动态)网页数据
    moviepy音视频剪辑:与大小相关的视频变换函数详解
    区块链知识博文1: 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)
    MoviePy v2.0.0.dev1尚不成熟,不建议大家使用
    区块链学习2:一些概念性的基础知识笔记
    老猿学5G:3GPP 5G规范中的URI资源概念
    区块链学习1:Merkle树(默克尔树)和Merkle根
    老猿Python博客文章目录索引
    老猿学5G:融合计费场景的Nchf_ConvergedCharging_Create、Update和Release融合计费消息交互过程
  • 原文地址:https://www.cnblogs.com/zyzg/p/7867352.html
Copyright © 2011-2022 走看看