黑马程序员技术交流社区

标题: 关于IO合并流中的一个问题,求解决??急! [打印本页]

作者: ~IN_HAND~    时间: 2013-11-8 21:02
标题: 关于IO合并流中的一个问题,求解决??急!
IO中的SequenceInputStream可用于对字节流的合并,至于它的详细功能我就不解释了,坛里高手云集,多说就是班门弄斧了。
废话不多说,上代码,问题在代码中的注释里面:
代码里的方法,是将多个被拆分后的文件进行合并。


import java.io.*;
import java.util.*;
class SplitFile
{
        public static void main(String[] args) throws IOException
        {
                //splitFile();
                merge();
        }
        public static void merge() throws IOException
        {
                ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
                for(int i=1;i<=4;i++)
                {
                        al.add(new FileInputStream("d:\\zz\\part"+i+".part"));
                }

               //毕向东老师在说这个地方的时候,就是下面这句话一语带过,但我还是我没搞明白为啥下面的这个迭代器必须要用final修饰
               //如果不用final修饰将会怎样? 求详细点的解释????

               //因为下面使用的是匿名内部类,所以要对返回的局部变量使用final修饰
                final Iterator<FileInputStream> it = al.iterator();
                Enumeration<FileInputStream> en = new Enumeration<FileInputStream>()
                {
                        public boolean hasMoreElements()
                        {
                                return it.hasNext();
                        }
                        public FileInputStream nextElement()
                        {
                                return it.next();
                        }
                };
                SequenceInputStream sis = new SequenceInputStream(en);
                FileOutputStream fos = new FileOutputStream("d:\\zz\\1.avi");
                byte[] buf = new byte[1024*20];
                int len = 0;
                while((len=sis.read(buf))!=-1)
                {
                        fos.write(buf,0,len);
                }
                fos.close();
                sis.close();
        }

}

作者: Mr.Z.Lee    时间: 2013-11-8 21:42
  1. import java.io.*;
  2. import java.util.*;
  3. class SplitFile
  4. {
  5.         public static void main(String[] args) throws IOException
  6.         {
  7.                 //splitFile();
  8.                 merge();
  9.         }
  10.         public static void merge() throws IOException
  11.         {
  12.                 ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
  13.                 for(int i=1;i<=4;i++)
  14.                 {
  15.                         al.add(new FileInputStream("d:\\zz\\part"+i+".part"));
  16.                 }

  17.             
  18.                 final Iterator<FileInputStream> it = al.iterator();
  19.                 Enumeration<FileInputStream> en = new Enumeration<FileInputStream>()
  20.                 {
  21.                         public boolean hasMoreElements()
  22.                         {
  23.                                 return it.hasNext();
  24.                         }
  25.                         public FileInputStream nextElement()
  26.                         {
  27.                                 return it.next();
  28.                         }
  29.                 };
  30.                 SequenceInputStream sis = new SequenceInputStream(en);
  31.                 FileOutputStream fos = new FileOutputStream("d:\\zz\\1.avi");
  32.                 byte[] buf = new byte[1024*20];
  33.                 int len = 0;
  34.                 while((len=sis.read(buf))!=-1)
  35.                 {
  36.                         fos.write(buf,0,len);
  37.                 }
  38.                 fos.close();
  39.                 sis.close();
  40.         }

  41. }
复制代码
没有final就不能使用匿名内部类。
作者: 零下五度的水    时间: 2013-11-8 22:12
这是为了让代码更严谨,不用也无所谓。
因为你的匿名内部类调用了 it 对象的方法,
如果后面把 it 指向了一个新对象,那匿名内部类就不能正常工作了,变量en 也就废了

你去看api帮助文档的示例的话他们很多变量也是常用 final 修饰,这个算是工作经验积累出来的吧




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