黑马程序员——SequenceInputStream流将分割后的文件进行合并

来源:互联网 发布:ios9越狱软件源 编辑:程序博客网 时间:2024/05/13 12:38

-------android培训、java培训、java学习型技术博客、期待与您交流! ----------

/*

此程序是将一个文件进行切割,切割没有对应的流,只能通过下面的代码来完成。然后通过SequenceInputStream流将分割后的文件进行合并。




此程序的另外一个牛逼之处在于:


大家都知道,SequenceInputStream流的构造函数有两个:
1,只能接受两个字节输入流类型的参数。
2,能接收Enumeration类型的参数。如果我们确是要用到流比较多的话,就必须要用此构造函数。但是能创建
Enumeration(枚举)的集合只有Vector集合。但是Vector集合效率比较低,是安全的。
Enumeration的获取方式:
他是一个接口,并且是在Vector集合中以内部类的形式实现的。所以Enumeration对象的获取方式:
1.通过建立Vector集合调用elements()方法,来获取一个Enumeration对象
2.不用通过建立Vector集合来获取,可以在你的类中直接使用匿名内部类的方式将它实现了。
  而此程序中正是建立了ArrayList集合,通过匿名内部类获得了Enumeration对象。
  而且当内部类定义在局部时只能访问被final修饰的局部变量,即:让局部变量变成常量,它才能共享的到。


同样的道理Iterator肯定也能通过这个方法来获取。
*/
import java.io.*;
import java.util.*;
class SplitFile
{
public static void main(String[]args)throws IOException
{
//splitFile();


merge();

}
public static void splitFile()throws IOException
{
FileInputStream fis=new FileInputStream("f:/1.jpg");


FileOutputStream fos=null;

byte [] buf=new byte[1024*1024];

int len=0;
int count=1;
while((len=fis.read(buf))!=-1)
{
fos=new FileOutputStream("f:/splitfiles/"+(count++)+".part");
fos.write(buf,0,len);
fos.close();
}
fis.close();
}
public static void merge()throws IOException //merge:合并,融合
{
//因为创建Vector集合的效率比较低,所以创建ArrayList集合
ArrayList<FileInputStream> al=new ArrayList<FileInputStream>();

for(int x=1;x<=4;x++)
{
al.add(new FileInputStream("f:/splitfiles/"+x+".part"));
}

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("f:/splitfiles/2.jpg");

byte [] buf=new byte[1024];

int len=0;
while((len=sis.read(buf))!=-1)
{
fos.write(buf,0,len);
}

fos.close();
sis.close();




}

}

------- android培训、java培训、java学习型技术博客、期待与您交流! ----------


0 0
原创粉丝点击