Java使用缓冲数组分割,合并文件

原创 2018年04月17日 17:13:44


首先,进行文件分割

		File savePath = new File("Part");
		 File moveFile = new File("001.mp4");
		 cutFile(savePath, moveFile);

	private static void cutFile(File parent, File file) throws IOException {
		if (!file.exists()) {
			System.out.println("文件不存在");
			return;
		}
		parent.mkdirs();
		// 使用缓冲装饰类来读取视频文件数据
		BufferedInputStream buffIn = new BufferedInputStream(new FileInputStream(file));
		// 创建一个字节缓冲数组
		byte[] buff = new byte[1024 * 1024 * 10];
		int num = 0;
		int i = 1;
		while ((num = buffIn.read(buff)) != -1) {
			File saveP = new File(parent, i + ".part");
			FileOutputStream out = new FileOutputStream(saveP);
			i++;
			out.write(buff, 0, num);
			out.flush();
			out.close();
		}
		Properties pro = new Properties();
		pro.setProperty("filename", file.getName());
		pro.setProperty("partCount", i + "");
		FileOutputStream out = new FileOutputStream("info.properties");
		pro.store(out, "partCount");
		out.close();
		buffIn.close();
		
	}

下面视频合并

	File savePath = new File("Part");
		mergePartFile(savePath);

//视频合并
	private static void mergePartFile(File savePath) throws IOException {
		// 1.验证文件路径
		if (!savePath.exists()) {
			throw new RuntimeException("碎片路径不正确");
		}
		// 2.先获取碎片文件的信息配置数据
		Properties pro = new Properties();
		// 3.创建一个配置文件流对象
		File[] proFile = savePath.listFiles(new FileNameFileterWithEnd(".properties"));
		if (proFile.length != 1) {
			System.out.println("碎片文件配置信息异常,无法正确合并");
			return;
		}
		// 创建流获取数据
		FileInputStream proIn = new FileInputStream(proFile[0]);
		pro.load(proIn);
		// 获取文件名和碎片数量
		String name = pro.getProperty("filename");
		int count = Integer.parseInt(pro.getProperty("partCount"));
		//
		System.out.println(name + ":" + count);
		File[] parts = savePath.listFiles(new FileNameFileterWithEnd(".part"));
		if (parts.length != count - 1) {
			System.out.println("要合并的碎片数量不正确");
			return;
		}
		// 合并
		// 创建一个保存输入流的集合
		ArrayList<FileInputStream> partsIn = new ArrayList<>();
		for (File file : parts) {
			partsIn.add(new FileInputStream(file));
		}
		// 将集合转变为枚举
		Enumeration<FileInputStream> enumIn = Collections.enumeration(partsIn);
		// 创建序列流对象
		SequenceInputStream sIn = new SequenceInputStream(enumIn);
		BufferedOutputStream bOut = new BufferedOutputStream(new FileOutputStream(new File(savePath, name)));
		byte[] buff = new byte[1024];
		int num = 0;
		while ((num = sIn.read(buff)) != -1) {
			bOut.write(buff, 0, num);
			bOut.flush();
		}
		bOut.close();
		sIn.close();
		for (FileInputStream fileInputStream : partsIn) {
			fileInputStream.close();
		}
	}

该方法只能合并10个以内文件,10个以上文件需要对文件名进行排序后合并,否则数据会乱




Java分布式架构:使用xFire和CXF开发WEB服务

-
  • 1970年01月01日 08:00

<编程之美>数组分割问题

题目概述:有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,并使两个子数组的和最接近。 假设数组A[1..2N]所有元素的和是SUM。模仿动态规划解0-1背包问题的策...
  • sushauai
  • sushauai
  • 2016-03-22 11:04:13
  • 294

第22天 SequenceInputStream、合并切割、对象的输入输出流、Properties配置文件、.printStream、编码与解码、转换流、递归

SequenceInputStream、合并切割、对象的输入输出流、Properties配置文件、.printStream、编码与解码、转换流、递归...
  • nupotian
  • nupotian
  • 2016-12-25 12:47:19
  • 449

用java nio合并两个小文件的方法

重点关注的就是 ByteBuffer 和 ByteBuffer数组,FileChanel 可以接收一个数组类型的ByteBuffer, 从而实现了合并两个文件。 另外注意的是,我测试的from1.t...
  • u011191463
  • u011191463
  • 2017-02-28 15:04:08
  • 480

编程之美2.18——数组分割

问题: 1. 有一个无序、元素个数为2n的正整数数组,要求:如何能把这个数组分割为两个子数组,子数组的元素个数不限,并使两个子数组之和最接近。 2. 有一个无序、元素个数为2n的正整数数组,要求:...
  • linyunzju
  • linyunzju
  • 2012-07-10 00:20:46
  • 10423

《编程之美》数组分割问题——个人想法和证明

最近一直看编程之美,想法真的很重要,今天发这篇文章还是有一点不自信,希望碰到志同道合的同学一起讨论下!   本文来自:http://blog.csdn.net/lengzijian/article...
  • lengzijian
  • lengzijian
  • 2012-08-08 11:19:12
  • 2494

【编程之美】数组分割问题

一,问题:       1. 有一个无序、元素个数为2n的正整数数组,要求:如何能把这个数组分割为两个子数组,子数组的元素个数不限,并使两个子数组之和最接近。       2. 有一个无序、元素个...
  • tianshuai11
  • tianshuai11
  • 2012-08-03 22:25:26
  • 3275

编程之美 - 数组分割

问题: 有一个没有排序,有2N个元素的数组,要求把这个数组分为两部分,分别含有N个元素,并使两个子数组的和最接近。 这里的程序主要是计算这个和的值。 比如数组 {1, 10, 100, ...
  • wangzhiyu1980
  • wangzhiyu1980
  • 2016-07-02 19:28:17
  • 917

JAVA IO :使用带缓冲的字节流读写数据

JAVA IO :使用带缓冲的字节流读写数据 /**  * 使用带缓冲的字节流读取数据  * 比没有使用缓冲的方法COP所用的时间要长很多  * BufferedInputStream()...
  • Jian_Sir
  • Jian_Sir
  • 2015-03-29 21:54:09
  • 1433

Java输入输出流与缓冲区的使用

Input/Output流: 将外设中的数据读取到内存中就是输入。 将内存中的数据写入到外设中就是出。 I/O流就是用来处理设备间的数据传输。用于操作流的对象都放在IO包中。 流按操作方式分为...
  • fu755383249
  • fu755383249
  • 2014-10-17 17:51:50
  • 2397
收藏助手
不良信息举报
您举报文章:Java使用缓冲数组分割,合并文件
举报原因:
原因补充:

(最多只允许输入30个字)