java输入输出流12_文件切割合并

1.切割文件案例

将一个媒体文件切割成多个碎片(每个碎片的大小为1M),并添加配置文件来保存被切割文件的个数。

实现步骤:

第一步:创建(指定)一个文件夹,用于保存切割出来的碎片文件。

第二步:创建需要切割的文件。

第三步:对文件进行切割处理。

  1. 读取需要切割的文件,每次读取1M的数据。

  2. 每个缓冲区获取到碎片时,使用输出对应流对象写入到一个新的文件。

  3. 通过配置文件保存切割文件的个数(方便后面读取碎片文件)

【实例】切割文件案例

public class SplitFileDemo {
	private static final int SIZE = 1024 * 1024; // 设置切割文件的大小
	public static void main(String[] args) throws IOException {
		// 第一步:创建一个文件夹,用于保存切割出来的碎片文件
		File dir = new File("E:\\splitFile");
		if(!dir.exists())
			dir.mkdirs();
		// 第二步:创建需要切割的文件
		File split = new File("E:\\第九章:IO流.pdf");
		// 第三步:对文件进行切割处理。
		splitFile(split, dir);
	}
	/**
	 * 切割文件方法
	 * @param file 需要切割的文件
	 * @param dir 存放切割后文件的目录
	 */
	public static void splitFile(File file, File dir) throws IOException {
		// 1.读取需要切割的文件,每次读取1M的数据
		// 创建需要切割文件的输入流对象
		FileInputStream fis = new FileInputStream(file);
		BufferedInputStream bis = new BufferedInputStream(fis);
		byte[] by = new byte[SIZE]; // 设置缓冲区为1M
		int len = 0, count = 0;  // count变量用于保存切割文件的个数
		while ((len = bis.read(by)) != -1) {
            // 2. 每个缓冲区获取到碎片时,使用输出对应流对象写入到一个新的文件
			File des = new File(dir, ++count + ".part");
			FileOutputStream fos = new FileOutputStream(des);
			BufferedOutputStream bos = new BufferedOutputStream(fos);
			bos.write(by, 0, len);
	        bos.close();
		}
		bis.close();
		// 3.通过配置文件保存切割文件的个数
		Properties properties = new Properties();
		properties.setProperty("count", count + "");
        File file = new File(dir, "count.properties");
		FileOutputStream stream = new FileOutputStream(file);
		properties.store(stream, "split file count");
stream.close();
	}
}

2.合并文件案例

将每一个碎片文件(每个碎片的大小为1M)进行合并。

实现步骤:

第一步:创建(指定)一个文件夹,用于保存切割出来的碎片文件。

第二步:创建源文件输出流对象,用于保存合并之后的文件。

第三步:对切割文件合并文件。

  1. 从配置文件中获取碎片文件的个数。

  2. 通过循环读取每个碎片文件的数据。

  3. 把读取的碎片文件存储到一个文件中,从而实现合并文件。

【实例】切割文件案例

public class SplitFileDemo {
	public static void main(String[] args) throws IOException {
		// 第一步:创建(指定)一个文件夹,用于保存切割出来的碎片文件。
		File dir = new File("E:\\splieFile");
		if(!dir.exists())
			dir.mkdirs();
   		// 第二步:创建源文件输出流对象,用于保存合并之后的文件
		File merge = new File("E:\\mergeFile.pdf");
		if (!merge.exists()) {
			merge.createNewFile();
		}
		// 第三步:进行对切割文件合并文件
		mergeFile(merge, dir);
	}
	/**
	 * 合并文件方法
	 * @param merge 存放合并之后的文件
	 * @param dir 存放切割文件和配置文件的目录
	 */
	public static void mergeFile(File merge, File dir) throws IOException {
		// 1.从配置文件中获取碎片文件的个数
		Properties properties = new Properties();
		File propFile = new File(dir, "count.properties");
		FileInputStream stream = new FileInputStream(propFile);
		properties.load(stream);
		int count = Integer.parseInt(properties.getProperty("count"));
stream.close();
		// 2.读取每个碎片文件的数据
		FileOutputStream fos = new FileOutputStream(file);
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		byte[] by = new byte[1024];
		for(int i = 1; i <= count; i++) {
			// 对每一个切割文件进行读取
           	File file = new File(dir, i + ".part");
			FileInputStream fis = new FileInputStream(file);
			BufferedInputStream bis = new BufferedInputStream(fis);
			int len = 0;
			while((len = bis.read(by)) != -1) {
				// 3.把读取的碎片文件存储到一个文件中,从而实现合并文件
				bos.write(by,  0,  len);
			}
			bis.close();
		}
		bos.close();
	}
}

3.SequenceInputStream类

有些情况下,当我们需要从多个输入流中向程序读入数据。此时,可以使用合并流,将多个输入流合并成一个SequenceInputStream流对象。

SequenceInputStream会将与之相连接的流集组合成一个输入流并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。 合并流的作用是将多个源合并合一个源。

  • 构造方法

参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。将按顺序读取由该枚举生成的输入流,以提供从此 SequenceInputStream 读取的字节。

public SequenceInputStream(Enumeration<? **extends** InputStream> e);

  • 使用SequenceInputStream****类来合并碎片文件

实现步骤:

第一步:获取需要合并文件的个数。

第二步:对切割文件进行合并。

  1. 创建一个list集合,来保存指定文件夹碎片流集合。

  2. 用集合工具类的enumeration()方法将list集合转换为Enumeration。

  3. 新建一个SequenceInputStream输入流对象,并传入Enumeration。

  4. 通过输出流对象,保存SequenceInputStream输入流中读取的内容。

public class SplitFileDemo {
	public static void main(String[] args) throws IOException {
		// 创建(指定)一个文件夹,用于保存切割出来的碎片文件。
		File dir = new File("E:\\splieFile");
		if(!dir.exists())
			dir.mkdirs();
		// 创建源文件输出流对象,用于保存合并之后的文件
		File merge = new File("E:\\mergeFile.pdf");
		if (!merge.exists()) {
			merge.createNewFile();
		}
		// 进行对切割文件合并文件
		mergeFile(merge, dir);
	}
	/**
	 * 合并文件方法
	 * @param file 存放合并之后的文件
	 * @param dir 存放切割文件和配置文件的目录
	 */
	public static void mergeFile(File file, File dir) throws IOException {
		// 第一步:获取需要合并文件的个数
		Properties properties = new Properties();
		FileInputStream stream = new FileInputStream(new File(dir, "count.properties"));
		properties.load(stream);
		int count = Integer.parseInt(properties.getProperty("count"));
		// 第二步:对切割文件进行合并
		// 1.创建一个list集合,来保存指定文件夹碎片流集合
		ArrayList<InputStream> list = new ArrayList<InputStream>();
		for(int i = 1; i <= count; i++) {
			list.add(new FileInputStream(new File(dir, i + ".part")));
		}
		// 2.用集合工具类的enumeration()方法将list集合转换为Enumeration
		Enumeration<InputStream> enumeration = Collections.enumeration(list);
		// 3.新建一个SequenceInputStream输入流对象,并传入Enumeration
		SequenceInputStream sis = new SequenceInputStream(enumeration);
		BufferedInputStream bis = new BufferedInputStream(sis);
        // 4.创建一个输出流,用于保存合并之后的碎片文件
		FileOutputStream fos = new FileOutputStream(file);
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		byte[] by = new byte[1024];
		int len = 0;
		while((len = bis.read(by)) != -1) {
			// 5.通过输出流对象,保存SequenceInputStream输入流中读取的内容
			bos.write(by,  0,  len);
		}
		bos.close();
		bis.close();
	}
}

ps:如需最新的免费文档资料和教学视频,请添加QQ群(627407545)领取。

发布了92 篇原创文章 · 获赞 0 · 访问量 2604

猜你喜欢

转载自blog.csdn.net/zhoujunfeng121/article/details/104751882