Java基础之案例:实现文件分割合并

案例:实现文件分割合并。

一、合并流:
SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。

package com.vince;

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.InputStream;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;

/**
 * 文件分割合并示例
 * 
 * @author vince
 * @description
 */
public class FileDivisionMergeDemo {

	/**
	 * 文件的分割 targetFile 要分割的目标文件 cutSize 每个文件大小
	 */
	private static void division(File targetFile, long cutSize) {

		if (targetFile == null)
			return;
		// 计算总分割的文件数
		int num = targetFile.length() % cutSize == 0 ? (int) (targetFile.length() / cutSize)
				: (int) (targetFile.length() / cutSize + 1);

		try {
			// 构造一个文件输入流
			BufferedInputStream in = new BufferedInputStream(new FileInputStream(targetFile));
			BufferedOutputStream out = null;

			byte[] bytes = null;// 每次要读取的字节数
			int len = -1; //每次实际读取的长度
			int count = 0;// 每一个文件要读取的次数

			//循环次为生成文件的个数
			for (int i = 0; i < num; i++) {
                            //这句话可以分开写 也可以合起来写
				out = new BufferedOutputStream(
						new FileOutputStream(new File("c:\\test\\" + (i + 1) + "-temp-" + targetFile.getName())));

				
				if (cutSize <= 1024) {
					bytes = new byte[(int) cutSize];
					count = 1;
				} else {
					bytes = new byte[1024];
					count = (int) cutSize / 1024;
				}
        //count一定放前面 不然到最后 边界时  len这个会多读一次 就不对了
				while (count > 0 && (len = in.read(bytes)) != -1) {
					out.write(bytes, 0, len);
					out.flush();
					count--;
				}

				//计算每个文件大小除于1024的余数,决定是否要再读取一次
				if (cutSize % 1024 != 0) {
					bytes = new byte[(int) cutSize % 1024];
					len = in.read(bytes);
					out.write(bytes, 0, len);
					out.flush();
					out.close();
				}
			}
			in.close();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 文件合并
	 */
	private static void merge(Enumeration<InputStream> es) {
		//构造一个合并流
		SequenceInputStream sis = new SequenceInputStream(es);
		try {
			BufferedOutputStream bos = new BufferedOutputStream(
					new FileOutputStream("c:\\test\\第01章_Java开发入门_01_计算机基本概念与DOS命令.avi"));
			
			byte[] bytes = new byte[1024];
			int len = -1;
			while((len=sis.read(bytes))!=-1){
				bos.write(bytes,0,len);
				bos.flush();
			}
			bos.close();
			sis.close();
			System.out.println("合并完成.");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {

//		File file = new File("c:\\第01章_Java开发入门_01_计算机基本概念与DOS命令.avi");
//		division(file, 1024 * 1024 * 20);
		
		try {
			InputStream in1 = new FileInputStream(new File("c:\\test\\1-temp-第01章_Java开发入门_01_计算机基本概念与DOS命令.avi"));
			InputStream in2 = new FileInputStream(new File("c:\\test\\2-temp-第01章_Java开发入门_01_计算机基本概念与DOS命令.avi"));
			InputStream in3 = new FileInputStream(new File("c:\\test\\3-temp-第01章_Java开发入门_01_计算机基本概念与DOS命令.avi"));
			InputStream in4 = new FileInputStream(new File("c:\\test\\4-temp-第01章_Java开发入门_01_计算机基本概念与DOS命令.avi"));
			InputStream in5 = new FileInputStream(new File("c:\\test\\5-temp-第01章_Java开发入门_01_计算机基本概念与DOS命令.avi"));

			//集合工具类,内部实现使用了数组
			Vector<InputStream> v = new Vector<InputStream>();
			v.add(in1);
			v.add(in2);
			v.add(in3);
			v.add(in4);
			v.add(in5);
			
			Enumeration<InputStream> es = v.elements();
			merge(es);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		
	}

}

合并

package com.vince;

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.InputStream;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;

/**
 * 文件分割合并示例
 * 
 * @author vince
 * @description
 */
public class FileDivisionMergeDemo {

	/**
	 * 文件的分割 targetFile 要分割的目标文件 cutSize 每个文件大小
	 */
	private static void division(File targetFile, long cutSize) {

		if (targetFile == null)
			return;
		// 计算总分割的文件数
		int num = targetFile.length() % cutSize == 0 ? (int) (targetFile.length() / cutSize)
				: (int) (targetFile.length() / cutSize + 1);

		try {
			// 构造一个文件输入流
			BufferedInputStream in = new BufferedInputStream(new FileInputStream(targetFile));
			BufferedOutputStream out = null;

			byte[] bytes = null;// 每次要读取的字节数
			int len = -1; //每次实际读取的长度
			int count = 0;// 每一个文件要读取的次数

			//循环次为生成文件的个数
			for (int i = 0; i < num; i++) {

				out = new BufferedOutputStream(
						new FileOutputStream(new File("c:\\test\\" + (i + 1) + "-temp-" + targetFile.getName())));

				
				if (cutSize <= 1024) {
					bytes = new byte[(int) cutSize];
					count = 1;
				} else {
					bytes = new byte[1024];
					count = (int) cutSize / 1024;
				}

				while (count > 0 && (len = in.read(bytes)) != -1) {
					out.write(bytes, 0, len);
					out.flush();
					count--;
				}

				//计算每个文件大小除于1024的余数,决定是否要再读取一次
				if (cutSize % 1024 != 0) {
					bytes = new byte[(int) cutSize % 1024];
					len = in.read(bytes);
					out.write(bytes, 0, len);
					out.flush();
					out.close();
				}
			}
			in.close();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 文件合并
	 */
	private static void merge(Enumeration<InputStream> es) {
		//构造一个合并流
		SequenceInputStream sis = new SequenceInputStream(es);
		try {
			BufferedOutputStream bos = new BufferedOutputStream(
					new FileOutputStream("c:\\test\\第01章_Java开发入门_01_计算机基本概念与DOS命令.avi"));
			
			byte[] bytes = new byte[1024];
			int len = -1;
			while((len=sis.read(bytes))!=-1){
				bos.write(bytes,0,len);
				bos.flush();
			}
			bos.close();
			sis.close();
			System.out.println("合并完成.");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {

//		File file = new File("c:\\第01章_Java开发入门_01_计算机基本概念与DOS命令.avi");
//		division(file, 1024 * 1024 * 20);
		
		try {
			InputStream in1 = new FileInputStream(new File("c:\\test\\1-temp-第01章_Java开发入门_01_计算机基本概念与DOS命令.avi"));
			InputStream in2 = new FileInputStream(new File("c:\\test\\2-temp-第01章_Java开发入门_01_计算机基本概念与DOS命令.avi"));
			InputStream in3 = new FileInputStream(new File("c:\\test\\3-temp-第01章_Java开发入门_01_计算机基本概念与DOS命令.avi"));
			InputStream in4 = new FileInputStream(new File("c:\\test\\4-temp-第01章_Java开发入门_01_计算机基本概念与DOS命令.avi"));
			InputStream in5 = new FileInputStream(new File("c:\\test\\5-temp-第01章_Java开发入门_01_计算机基本概念与DOS命令.avi"));

			//集合工具类,内部实现使用了数组
			Vector<InputStream> v = new Vector<InputStream>();
			v.add(in1);
			v.add(in2);
			v.add(in3);
			v.add(in4);
			v.add(in5);
			
			Enumeration<InputStream> es = v.elements();
			merge(es);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		
	}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值