1. SequenceInputStream
表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
SequenceInputStream 可以认为是一个工具类,将两个或者多个输入流当成一个输入流依次读取。完全可以从 IO 包中去除,还完全不影响 IO 包的结构,却让其更 “纯洁” ――纯洁的 Decorator 模式。
1-1. 序列流应用
- 序列流只负责源。对多个流进行合并。
- 切割or合并。将一个文件切割成多个文件 && 将多个文件碎片合并成一个文件。
1-2. SequenceInputStream序列流的步骤
- 找到目标文件
- 建立数据输入输出通道
- 建立序列流对象
- 关闭资源
2. 实例
- 切割MP3:
public static void cutFile() throws IOException{ File file = new File("E:\Music\忘尘谷.mp3"); //目标文件夹 File dir = new File("E:\MyMusic"); //建立数据输入通道 FileInputStream fis = new FileInputStream(file); //建立缓冲数组 byte[] buf = new byte[1024*1024];//1024*1024 = 1MB,即:把该音乐切割成每份1MB的大小 int length = 0; //边读边写 for (int i = 0; (length=fis.read(buf)) != -1; i++) {//读 (每次读1MB) FileOutputStream fos = new FileOutputStream(new File(dir,"wcg"+i+".mp3"));//建立数据输出通道 fos.write(buf, 0, length);//写 fos.close(); } fis.close(); }
- 合并MP3:
public static void mergeFile() throws IOException{ //找到目标文件 File dir = new File("E:\MyMusic"); //通过目标文件找到所有mp3,然后把这些mp3添加到vector集合中 Vector<FileInputStream> vector = new Vector<FileInputStream>(); File[] file = dir.listFiles(); for (File file2 : file) { if(file2.getName().endsWith(".mp3")){//获取以.mp3结尾的文件名 vector.add(new FileInputStream(file2));//添加到vector集合中 } } Enumeration<FileInputStream> e = vector.elements();//返回此向量组件的枚举。即把上面集合中的元素给了e对象 SequenceInputStream sis = new SequenceInputStream(e);//建立序列流对象//建立缓冲数组读取文件 byte[] buf = new byte[1024]; int length = 0; FileOutputStream fos = new FileOutputStream(new File("MyMusic\MergeMusic\合并音乐-忘尘谷.mp3"));//建立输出字节流 while((length = sis.read(buf)) != -1){//读 fos.write(buf, 0, length);//写 } fos.close(); sis.close(); }