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

来源:互联网 发布:快玩mac版 编辑:程序博客网 时间:2024/04/26 17:04
------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;//定义一个分割缓冲区,每个缓冲区的大写是3kbyte[] 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>() {@Overridepublic boolean hasMoreElements() {return it.hasNext();}@Overridepublic 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();}}}

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