欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

黑马程序员——文件的切割与合并,

来源: javaer 分享于  点击 31278 次 点评:194

黑马程序员——文件的切割与合并,


------Java培训、Android培训、java学习型博客、期待与您交流! -------   文件的切割于合并 一、知识概述:        我们在传送文件的时候,文件太大的情况下可能需要分开传送,那么就需要对文件进行切割。但切割发送给对方后,对方收到的文件是一些碎片,并不是完整的文件,对方需要对文件进行合并才能访问。 二、文件切割:        我们在学习IO流的时候会遇到这样一个对象:FileInputStream,这是一个可以操作文件的流对象。那么我们就给可以用这个对象来进行文件切割。 三、需求:       把桌面上一张图片切割成一些碎片文件放在桌面上的splitfile文件中,文件存储名以part_**.part的格式存储。 四、代码:       1、文件分割:       
package it.heima;

import java.io.*;
public class SplitFile {

	public static void main(String[] args) {
		//创建一个文件对象,并关联需要分割的文件
		File file = new File("C:\\Documents and Settings\\Administrator\\桌面\\heima.jpg");
		splitFile(file);
	}
	
	/**
	 * 分割一个文件
	 * @param file 文件对象
	 */
	public static void splitFile(File file) {
		try {
			//创建文件输入流并关联需要分割的文件
			FileInputStream fis = new FileInputStream(file);
			//创建文件输出流,用于把分割后的文件写入到指定的目录中
			FileOutputStream fos = null;
			//定义一个分割缓冲区,每个缓冲区的大写是3k
			byte[] buf = new byte[1024*3];
			int num = 0;
			//定义计数器,用于对文件碎片命名时使用
			int count = 1;
			//循环读取需要分割的文件
			while((num = fis.read(buf)) != -1) {
				//把缓冲区中的数据写入到分割文件中
				fos= new FileOutputStream("C:\\Documents and Settings\\Administrator\\桌面\\splitfile\\" + (count++) + ".part");
				fos.write(buf,0,num);
				fos.close();
			}
			fis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

如上代码所示,我们把桌面上一张名叫heima.jpg的图片进行了分割,每个碎片文件的大小是3kb。运行结果如图所示: 看图所知,我们把heima.jpg这张图片分割成了4个碎片文件。
五、文件合并:        同样,我们在学习流的时候遇到这样一个对象:SequenceInputStream。SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。由此可知我们可以用不同的文件出入流对象关联不对的碎片文件,然后把这写流放到SequenceInputStream中,这样就可以把这些文件输入流对象关联成一个流对象,再把这个流对象中的数字写入到一个文件中,这样就能实现文件碎片的合并了。 六、需求:        把上面分割的文件对象进行合并,并放到桌面上的mergefile文件夹中。 七、代码:
package it.heima;

import java.util.*;
import java.io.*;
public class MergeFile {

	public static void main(String[] args) {
		merge();
	}
	
	/**
	 * 文件分割
	 */
	public static void merge() {
		try {
			//创建一个专门用于存放FileInputStream文件输入流对象的list集合
			ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
			//把关联碎片文件的流对象添加到集合中
			for(int x = 1; x<=4;x++) {
				al.add(new FileInputStream("C:\\Documents and Settings\\Administrator\\桌面\\splitfile\\"+x+".part"));
			}
			//对集合迭代
			final Iterator it = al.iterator();
			
			//把迭代器中的对象存放当列举对象Enumeration中
			Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() {

				@Override
				public boolean hasMoreElements() {
					return it.hasNext();
				}

				@Override
				public FileInputStream nextElement() {
					return (FileInputStream) it.next();
				}
			};
			
			//把流对象集合关联到SequenceInputStream中
			SequenceInputStream sis = new SequenceInputStream(en);
			//定义合并文件存放位置
			FileOutputStream fos = new FileOutputStream("C:\\Documents and Settings\\Administrator\\桌面\\mergefile\\merg.jpg");
			byte[] buf = new byte[1024];
			int num =0;
			//将碎片文件写入合并文件
			while((num = sis.read(buf)) != -1) {
				fos.write(buf, 0, num);
			}
			fos.close();
			sis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

八、运行结果: 九、总结:        通过以上描述,我们就可以对问价进行切割和合并了。

相关文章

    暂无相关文章
相关栏目:

用户点评