A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HeiMa-黄倲江 中级黑马   /  2012-11-5 15:03  /  2654 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

public static void merge()throws IOException{
Vector<FileInputStream> v = new Vector<FileInputStream>();               
ArrayList<FileInputStream> list = new ArrayList<FileInputStream>();               
for(int i =1; i<=6;i++){
                        list.add(new FileInputStream("D:\\myWord\\maxTest\\splitFiles\\"+i+".part"));
                }
                //问题来了. 可是ArrayList集合没有enumtion 阿!   怎么办?
                //迭代器有阿
                final Iterator<FileInputStream>  it = list.iterator();
                //现在呢 就可以创建一个Enumeration
                Enumeration<FileInputStream> en = new Enumeration<FileInputStream>(){
                        public boolean hasMoreElements(){
                                return it.hasNext();
                        }
                        public FileInputStream nextElement(){
                                return it.next();
                        }
                };
                SequenceInputStream sis = new SequenceInputStream(en);//参数是不是传一个enumtion阿
               
                FileOutputStream fos = new FileOutputStream("D:\\myWord\\maxTest\\splitFiles\\th.mp3");
               
                byte[] buf = new byte[1024];
                int len=0;
                while((len=sis.read(buf)) != -1){
                        fos.write(buf,0,len);
                }
                fos.close();
                sis.close();
        }


红色部分的, 有点不能理解  

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
Enumeration<FileInputStream> en = new Enumeration<FileInputStream>(){
                        public boolean hasMoreElements(){
                                return it.hasNext();
                        }
                        public FileInputStream nextElement(){
                                return it.next();
                        }                };
这个可是老毕视 频里面精辟的地方啊!
哥们可得记好了!
我当时在学SequenceInputStream的时候,发现构造方法里面需要Enumeration,当时可是相当的好奇。想看看老毕是怎么实现这个Enumeration。(当时我以为只有Vector中的elements才可以实现Enumeration的)。
然后就耐心的看下去了,发现老毕用的是这种方法,当时可是相当的无语啊……

这儿相当于创建了Enumeration的子类,然后重写了Enumeration中的相关方法,而里面用到的变量就是迭代器中的Iterator。因为Iterator中的方法
与Enumeration中方法大体相同,所以直接将Iterator中的相关方法进行包装。

这在java里面和增强设计模式的理念差不多,只不过此处没有增强的功能。
建议看看SynchronizedSet与Set的源代码。
直接在eclipse中观看。
这种设计理念很常见。老张的线程并发库相关的视频中也很强调。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
Vector<FileInputStream> v = new Vector<FileInputStream>();               
ArrayList<FileInputStream> list = new ArrayList<FileInputStream>();

Vector跟ArrayList基本相似,可以说ArrayList是在Vector基础上创立出来的.唯一的区别就是:Vector是线程同步运算的,而ArrayList则没有,所以Vector比ArrayList安全.但是!在处理存储的时候,Vector如果存满了就会把自己的容量翻倍继续容纳,而ArrayList则只增加50%,所以内存利用上ArrayList性价比高.

关于
  1. Enumeration<FileInputStream> en = new Enumeration<FileInputStream>(){
  2.                         public boolean hasMoreElements(){
  3.                                 return it.hasNext();
  4.                         }
  5.                         public FileInputStream nextElement(){
  6.                                 return it.next();
  7.                         }  
复制代码
首先要了解Enumeration这个具体是什么东西:你可以理解为另一个Iterator,只不过属性跟方法有些不同罢了.

上面这段代码的功能是:因为Iterato本身不具备返回enumtion,而SequenceInputStream又要用到enumtion,所以只能用Iterato的.hasnext();.next();去重写Enumeration的方法来达到功能的实现.就像是:我只有榔头,你只有钉子,我们凑合一下就能产生钉东西的功能,嘛 差不多就这个意思.

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
Enumeration<FileInputStream> en = new Enumeration<FileInputStream>(){...这是典型的匿名内部类的用法,这里的意思是实例化一个内部类,而此内部类没有名字,但实现了Enumeration接口,因此返回的对象实例可以赋值给Enumeration的变量
回复 使用道具 举报
Enumeration<FileInputStream> en = new Enumeration<FileInputStream>(){...这是典型的匿名内部类的用法,这里的意思是实例化一个内部类,而此内部类没有名字,但实现了Enumeration接口,因此返回的对象实例可以赋值给Enumeration的变量

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
ArrayList 与 Vector 都以数组方式存储数据,都是大小可变的,都支持按索引方式访问数据,但插入数据时会涉及到数据的移动等内存操作,所以索引快,增删数据慢。其中 Vcetor 是 synchronized 的,性能比 ArrayList 稍差

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
Vector是线程安全的,ArrayList是线程不安全的,如果在线程方面有要求的话,需要用vector,ArrayList的效率会高一点,在对线程没有要求的情况下,最好用ArrayList,当集合空间不够时,两者的增长也不同,vector增长为原来的1倍,而ArrayList增长0.5

评分

参与人数 1黑马币 +1 收起 理由
heima_666 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马