黑马程序员技术交流社区

标题: 合并与分割文件 [打印本页]

作者: 优乐    时间: 2014-8-26 18:27
标题: 合并与分割文件
下面是自己写的代码
  1. package IO;

  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.SequenceInputStream;
  7. import java.util.ArrayList;
  8. import java.util.Enumeration;
  9. import java.util.Iterator;
  10. import java.util.List;

  11. /**
  12. * 合并分割文件
  13. *                
  14. *                
  15. *
  16. *
  17. * @author Administrator
  18. *
  19. */
  20. public class SplitFile {
  21.         public static void main(String[] args) throws IOException{
  22.                 //要分割的文件
  23.                 File file=new File("1.jpg");
  24.                 int jpg=5;
  25.                 split(file, jpg);
  26.                 merge("合并后的图片.jpg","1.part","2.part","3.part","4.part","5.part");
  27.         }
  28.         //分割文件,file要分割的文件,jpg分割成多少份
  29.         public static void split(File file,int part) throws IOException{
  30.                
  31.                 //自定义分割成多少个文件后,每个分割文件的最大值
  32.                 int partSize=(int)file.length()/part+1;
  33.                 //用来接受从文件读取的字节
  34.                 byte[] buf=new byte[1024];
  35.                 //从文件读取了多少个字节
  36.                 int len=0;
  37.                 //当前分割文件的大小
  38.                 int size=0;
  39.                 //每次动态创建文件的名字
  40.                 int i=1;
  41.                 //输入流,读取要分割文件的字节
  42.                 FileInputStream fis=new FileInputStream(file);
  43.                 //输出流,写到分割文件的输出流
  44.                 FileOutputStream fos=new FileOutputStream(i+".part");
  45.                 //读取源文件
  46.                 while((len=fis.read(buf))!=-1){
  47.                         //写入buf字节数组后,分割文件的大小
  48.                         size+=len;
  49.                         //如果分割文件的最大值 > 即将写入buf后分割文件的实际大小
  50.                         if(size<=partSize){
  51.                                 //将buf写入到分割文件中
  52.                                 fos.write(buf);
  53.                         }
  54.                         //否则
  55.                         else{
  56.                                 //把分割文件写满,从buf的第一个元素开始,写len-(size-partSize)个元素
  57.                                 fos.write(buf, 0, len-(size-partSize));
  58.                                 //关闭输出流
  59.                                 fos.close();
  60.                                 //创建新输出流,
  61.                                 fos=new FileOutputStream(++i+".part");
  62.                                 //把buf中未被写入的部分,写入到新建的分割文件中
  63.                                 fos.write(buf, len-(size-partSize), size-partSize);
  64.                                 //将size设置成已写入分割文件的字节数
  65.                                 size=size-partSize;
  66.                         }
  67.                         //当前buf已经全部写出去了,读取下一个buf
  68.                 }
  69.                 //源文件全部读取完毕,不需要读取了,关闭输入流
  70.                 fis.close();
  71.                 //关闭最后一个创建的输出流
  72.                 fos.close();
  73.         }
  74.         //合并分割文件,desPath合并后的文件,filePath需要合并的文件
  75.         public static void merge(String desPath,String... filePaths) throws IOException{
  76.                 //得到参数中的文件输入流,放到集合中
  77.                 List<FileInputStream> files=new ArrayList<FileInputStream>();
  78.                 for(int i=0;i<filePaths.length;i++){
  79.                         File file=new File(filePaths[i]);
  80.                         System.out.println(file.getAbsolutePath());
  81.                         files.add(new FileInputStream(file));
  82.                 }
  83.                
  84.                 //使用集合的迭代器
  85.                 final Iterator<FileInputStream> it=files.iterator();
  86.                 //用内部类实现Enumeration接口,创建enume对象
  87.                 Enumeration<FileInputStream> enume=new Enumeration<FileInputStream>() {
  88.                        
  89.                         @Override
  90.                         public FileInputStream nextElement() {
  91.                                 // TODO Auto-generated method stub
  92.                                 return it.next();
  93.                         }
  94.                        
  95.                         @Override
  96.                         public boolean hasMoreElements() {
  97.                                 // TODO Auto-generated method stub
  98.                                 return it.hasNext();
  99.                         }
  100.                 };
  101.                 //使用SequenceInputStream合并输入流,合并分割文件
  102.                 SequenceInputStream sequence=new SequenceInputStream(enume);
  103.                 FileOutputStream fos=new FileOutputStream(desPath);
  104.                 byte[] buf=new byte[1024];
  105.                 int len=0;
  106.                 while((len=sequence.read(buf))!=-1){
  107.                         fos.write(buf, 0, len);
  108.                 }
  109.                 fos.close();
  110.                 sequence.close();
  111.         }
  112. }
复制代码




作者: 杨列振    时间: 2014-8-26 23:36
你贴上来的目的是什么?
作者: 格子、    时间: 2014-8-27 07:44
这些代码相信看过视频的都有敲过,不知道哥们贴上来是出于什么目的呢?
作者: 优乐    时间: 2014-8-27 08:30
格子、 发表于 2014-8-27 07:44
这些代码相信看过视频的都有敲过,不知道哥们贴上来是出于什么目的呢?

那你觉得我这个跟视频是一样的吗,你仔细看过吗,我觉得这个流程比较有难度,重点不是用了什么知识,是这个思路,好吗
这是我自己的想法,我看视频也觉得挺简单,但是自己敲的时候,有很多细节要注意
不信你自己去敲一遍

给定一个指定文件,可以自己随便定义分割几个个数
作者: 格子、    时间: 2014-8-27 09:30
优乐 发表于 2014-8-27 08:30
那你觉得我这个跟视频是一样的吗,你仔细看过吗,我觉得这个流程比较有难度,重点不是用了什么知识,是这 ...

我想你理解错我意思了,我意思是请说明一个你和大家要交流的是什么!!!直接这么贴上了,也没什么说明,你觉得你看了会是什么感受???
作者: 天黑偷牛    时间: 2014-8-27 10:31
帖子有点长,楼主要是前面或后面有点总结的话,就更好了
作者: 彭卫红    时间: 2014-8-28 00:19
嗯嗯,能带上总结就好了,比如和视频讲的区别




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2