zoukankan      html  css  js  c++  java
  • JAVA学习课第五 — IO流程(九)文件分割器合成器

    文件分割器

    private static final int SIZE = 1024 *1024;
    	public static void splitFile(File file) throws IOException{
    		
    		//用读取流关联文件(不确定文件格式)
    		
    		FileInputStream fis = new FileInputStream(file);//源是一个
    		
    		byte[] by = new byte[SIZE];//定义1M的缓冲区
    		
    		FileOutputStream fos = null;//汇不知道有多少个
    		
    		int len = 0;
    		int count = 1;//记录子文件个数
    		
    		File dir = new File("D:\patFiles");
    		if(!dir.isFile()){
    			dir.mkdirs();
    		}
    		
    		while((len = fis.read(by))!=-1){
    			fos = new FileOutputStream(new File(dir,(count++)+".part"));//自己定义文件格式
    			fos.write(by,0,len);
    		}
    		fos.close();
    		fis.close();
    	}


    文件合并

    public static void main(String[] args) throws IOException {
    		
    		File file = new File("D:\PartFile");
    		Merge(file);
    	}
    	public static void Merge(File dir)throws IOException{
    		
    		ArrayList<FileInputStream> AL = new ArrayList<FileInputStream>();
    		
    		for(int i = 1;i<=7;i++){
    			AL.add(new FileInputStream(new File(dir,i+".part")));
    		}
    		
    		Enumeration<FileInputStream> en = Collections.enumeration(AL);
    		SequenceInputStream sis = new SequenceInputStream(en);
    		
    		FileOutputStream fos = new FileOutputStream(new File(dir,"盛夏光年.mp3"));
    		
    		byte[] by = new byte[1024];
    		int len = 0;
    		while((len = sis.read(by))!=-1){
    			fos.write(by, 0, len);
    		}
    		sis.close();
    		fos.close();
    	}

    文件分割合并+配置文件

    import java.io.*;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Enumeration;
    import java.util.Properties;
    
    public class Main 
    {
    		private static final int SIZE = 1024 *1024;
    	public static void main(String[] args) throws IOException {
    		
    		File file1 = new File("d:\NeedSplit\盛夏光年.mp3");
    		File file2 = new File("D:\PartFiles");
    		splitFile(file1);
    		Merge_1(file2);
    	}
    	
    	public static void splitFile(File file) throws IOException{
    		
    		//用读取流关联文件(不确定文件格式)
    		
    		FileInputStream fis = new FileInputStream(file);//源是一个
    		
    		byte[] by = new byte[SIZE];//定义1M的缓冲区
    		
    		FileOutputStream fos = null;//汇不知道有多少个
    		
    		int len = 0;
    		int count = 1;//记录子文件个数
    		
    		/*分割文件必需要记录分割文件的名称和分割处理的碎片文件的个数,方便合并
    		 * 这个信息为了进行描写叙述,使用键值对的方法。所以使用Properties对象*/
    		
    		Properties pro = new Properties();
    		
    		
    		File dir = new File("D:\PartFiles");
    		if(!dir.isFile()){
    			dir.mkdirs();
    		}
    		
    		while((len = fis.read(by))!=-1){
    			fos = new FileOutputStream(new File(dir,(count++)+".part"));//自己定义文件格式
    			fos.write(by,0,len);
    			fos.close();
    		}
    		//将分割后文件的信息保存在pro集合中
    		pro.setProperty("partCount", count+"");
    		pro.setProperty("fileName", file.getName());
    		fos = new FileOutputStream(new File(dir,count+".properties"));
    		//将pro集合的信息存储在集合中
    		pro.store(fos, "save file infmation");
    		fis.close();
    	}
    	
    	public static void Merge_1(File dir)throws IOException{
    		
    		//获取指定文件夹下配置文件对象
    		File[] files = dir.listFiles(new SuffixFilter(".properties"));//new一个过滤器
    		if(files.length!=1){
    			throw new RuntimeException(dir+"该文件夹下没有properties扩展名的文件或者不唯一 ");
    		}
    		//记录配置文件对象
    		File confile = files[0];
    		
    		//获取配置文件信息
    		Properties pro = new Properties();
    		FileInputStream fis = new FileInputStream(confile);//关联流对象
    		
    		pro.load(fis);//载入信息
    			
    		String filename  = pro.getProperty("fileName");//得到文件名称
    		int count = Integer.parseInt(pro.getProperty("partCount"));//得到碎片个数
    		
    		//获取该文件夹下的全部碎片文件
    		//定义过滤器。推断碎片文件的个数与配置信息中的碎片信息是否一致
    		File[] partFiles = dir.listFiles(new SuffixFilter(".part"));
    		if(partFiles.length!=(count-1)){
    			throw new RuntimeException("碎片文件个数不正确,应是"+count+"个!");
    		}
    		
    		//将碎片文件和流对象关联。并存储集合中
    		ArrayList<FileInputStream> AL = new ArrayList<FileInputStream>();
    		for(int i = 0;i<partFiles.length;i++){
    			AL.add(new FileInputStream(partFiles[i]));
    		}
    		
    		//将多个流合并成一个序列流
    		Enumeration<FileInputStream> en = Collections.enumeration(AL);
    		SequenceInputStream sis = new SequenceInputStream(en);
    		
    		//读写过程
    		FileOutputStream fos = new FileOutputStream(new File(dir,filename));
    		byte[] by = new byte[1024];
    		int len = 0;
    		while((len = sis.read(by))!=-1){
    			fos.write(by, 0, len);
    		}
    		sis.close();
    		fos.close();
    	}
    }
    




    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    Docker 常用命令及操作
    Docker 启动 tomcat 成功,但是访问为 404
    Linux 使用 yum install 安装程序时,提示另外一个程序锁定了 yum 等待它退出...
    Centos 6.8 安装 Docker 及 Docker 入门介绍
    iptables常见的模块拓展-m iprange 、-m multiport、
    iptables -m state模块 注意与-m conntrack的区别
    ros single network adapter的nat
    trap 信号捕捉
    ifconfig命令
    使用pipework给docker配置物理机器网卡上的地址
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4912445.html
Copyright © 2011-2022 走看看