(20)IO流之SequenceInputStream 序列流

序列流,对多个流进行合并。

SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。

序列流,对多个流进行合并。

SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。

合并两个流

使用构造函数SequenceInputStream(InputStream s1, InputStream s2)

 1 //使用SequenceInputStream合并两个文件
 2     public static void merge2() throws IOException{
 3         //找到目标文件
 4         File inFile1 = new File("d:\\a.txt");
 5         File inFile2 = new File("d:\\b.txt");
 6         File outFile = new File("D:\\c.txt");
 7         //建立数据通道
 8         FileOutputStream fileOutputStream = new FileOutputStream(outFile);
 9         FileInputStream fileInputStream1 = new FileInputStream(inFile1);
10         FileInputStream fileInputStream2 = new FileInputStream(inFile2);
11
12         //建立序列流对象
13         SequenceInputStream inputStream = new SequenceInputStream(fileInputStream1,fileInputStream2);
14         byte[] buf = new byte[1024];
15         int length = 0;
16         while((length = inputStream.read(buf))!=-1)
17         {
18             fileOutputStream.write(buf, 0, length);
19         }
20         inputStream.close();
21 //        fileInputStream1.close();    //查看上面inputStream.close()的源码就可以看到,它穿起来的流一块关闭了
22 //        fileInputStream2.close();
23         fileOutputStream.close();
24 }

合并多个文件

 1 //把三个文件合并成一个文件
 2     public static void merge3() throws IOException
 3     {
 4         //找到目标文件
 5         File file1 = new File("d:\\a.txt");
 6         File file2 = new File("d:\\b.txt");
 7         File file3 = new File("D:\\c.txt");
 8         File file4 = new File("d:\\d.txt");
 9         //建立对应的输入输出流对象
10         FileInputStream fileInputStream1 = new FileInputStream(file1);
11         FileInputStream fileInputStream2 = new FileInputStream(file2);
12         FileInputStream fileInputStream3 = new FileInputStream(file3);
13         FileOutputStream fileOutputStream = new FileOutputStream(file4);
14
15         //创建序列流对象
16         Vector<FileInputStream> vector = new Vector<FileInputStream>();
17         vector.add(fileInputStream1);
18         vector.add(fileInputStream2);
19         vector.add(fileInputStream3);
20         Enumeration<FileInputStream> e = vector.elements();
21
22         SequenceInputStream inputStream = new SequenceInputStream(e);
23
24         //读取文件的数据
25         int length =0;
26         byte[] buf = new byte[1024];
27         while((length = inputStream.read(buf))!=-1)
28         {
29             fileOutputStream.write(buf, 0, length);
30         }
31         inputStream.close();
32         fileOutputStream.close();
33     }

下面是一个例子把一个mp3文件切割合并的过程:

 1 public class Demo2
 2 {
 3     public static void main(String[] args) throws IOException
 4     {
 5         cutFile();
 6         mergeFile();
 7     }
 8
 9     //合并
10     public static void mergeFile() throws IOException
11     {
12         //找到目标文件
13         File dir = new File("D:\\part");
14         Vector<FileInputStream> vector = new Vector<FileInputStream>();
15         //通过目标文件夹找到所有的mmp3并添加到Vector中
16         File[] files =  dir.listFiles();
17         for (File file : files)
18         {
19             if(file.getName().endsWith("mp3"))
20             {
21                 vector.add(new FileInputStream(file));
22             }
23         }
24
25         //通过vector获取迭代器对象
26         Enumeration<FileInputStream> e =  vector.elements();
27
28         SequenceInputStream inputStream = new SequenceInputStream(e);
29
30         //建立文件的输出通道
31         FileOutputStream fileOutputStream = new FileOutputStream("D:\\merge.mp3");
32         //建立缓冲数组
33         int length = 0;
34         byte[] buf = new byte[1024*1024];
35         while((length = inputStream.read(buf))!=-1)
36         {
37             fileOutputStream.write(buf, 0, length);
38         }
39     }
40
41
42     //切割
43     public static void cutFile() throws IOException
44     {
45         File file = new File("D:\\1.mp3");
46         //目标文件夹
47         File dir = new File("D:\\part");
48         //建立数据的输入通道
49         FileInputStream fileInputStream = new FileInputStream(file);
50         //建立缓存数组存储
51         byte[] buf = new byte[1024*1024];
52         int length = 0;
53         for(int i = 1 ; (length = fileInputStream.read(buf))!=-1; i ++)
54         {
55             FileOutputStream fileOutputStream = new FileOutputStream(new File(dir, "part"+i+".mp3"));
56             fileOutputStream.write(buf, 0, length);
57             fileOutputStream.close();
58         }
59         //关闭资源
60         fileInputStream.close();
61     }
62 }

时间: 2024-12-25 23:27:11

(20)IO流之SequenceInputStream 序列流的相关文章

黑马程序员——Java基础——IO流(二)——File类、Properties类、打印流、序列流

第一件 File类 一.File类 a.用于将文件或者文件夹封装成对象 b.方便对文件与文件夹的属性信息进行操作 c.File对象可以作为参数传递给流的构造函数 d.了解File类中的常用方法 二.File对象的创建 a.File f=new File("a:\\a.txt"): b.File f2=new File("C:\\abc","a.txt");//分开的好处是后一个参数能够使用其他对象如string c.File d=new File

黑马程序员——Java基础---IO(三)--File类、Properties类、打印流、序列流(合并流)

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- File类 一.概述 1.File类:文件和目录路径名的抽象表现形式 2.特点: 1)用来将文件或文件夹封装成对象 2)方便于对文件与文件夹的属性信息进行操作,因此是对流操作的一种补充 3)File类的实例是不可变的:也就是说,一旦创建,

Java基础---IO(二)--File类、Properties类、打印流、序列流(合并流)

第一讲     File类 一.概述 1.File类:文件和目录路径名的抽象表现形式 2.特点: 1)用来将文件或文件夹封装成对象 2)方便于对文件与文件夹的属性信息进行操作 3)File类的实例是不可变的:也就是说,一旦创建,File 对象表示的抽象路径名将永不改变 4)File对象可以作为参数传递给流的构造函数 二.File对象创建 方式一: File f =new File("a.txt"); 将a.txt封装成File对象.可以将已有的和未出现的文件或者文件夹封装成对象. 方式

IO包中的其他类 打印流,序列流,操作对象,管道流,RandomAccessFile,操作基本数据类型,操作字节数组

打印流,序列流,操作对象,管道流,RandomAccessFile,操作基本数据类型,操作字节数组 一.打印流: 该流提供了打印方法,可以将各种数据类型的数据都原样打印. 字节打印流PrintStream构造函数可以接收的参数类型1.File对象 File2.字符串路径 String3.字节输出流 OutputStream 字符打印流PrintWriter(更常用)1.File对象 File2.字符串路径 String3.字节输出流 OutputStream4.字符输出流 Writer publ

SequenceInputStream:序列流

作用就是将多个读取流合并成一个读取流.实现数据合并. 表示其他输入流的逻辑串联.它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止. 这样做,可以更方便的操作多个读取流,其实这个序列流内部会有一个有序的集合容器,用于存储多个读取流对象. 该对象的构造函数参数是枚举,想要获取枚举,需要有Vector集合,但不高效.需用ArrayList,但ArrayList中没有枚举,只有自己去创建枚举对象. 但是方法

JAVA学习第五十四课 — IO流(八)打印流 &amp; 序列流

一.综合练习-文件清单列表 获取指定目录下,指定扩展名的文件(含子目录),并将这些文件的绝对路径写到一个文本文件中.也就是建立一个指定扩展名的文件列表 1.深度遍历 2.过滤器->容器 3.写入文件 import java.util.List; import java.io.*; import java.util.ArrayList; public class Main { public static void main(String[] args) throws IOException { F

021.11 IO流 序列流

序列流:SequenceInputStream特点:流对象有序排列解决问题:将多个输入流合并成一个输入流,将多个源合并成一个源,对于多个源的操作会变简单. 构造函数参数就是输入流,一初始化就合并了多个流. public static void main(String[] args) throws IOException { //获取枚举,Vector有,但是效率低,使用ArrayList ArrayList<FileInputStream> al = new ArrayList<File

IO流之Properties(String键值对)+序列流+打印流+commons-IO(最终流程)

学了这么多全是给他用的之Commons 用这个的前提需要导包, ①创建lib文件夹 ②将下载的commos-io.jar拷贝到lib文件夹 ③右键点击commons-io.jar,Build Path→Add to Build Path 然后介绍两个工具类 1.2 FilenameUtils 这个工具类是用来处理文件名,他可以轻松解决不同操作系统文件名称规范不同的问题 l 常用方法: getExtension(String path):获取文件的扩展名: getName(String filen

黑马程序员—IO包中的其他流对象

--Java培训.Android培训.iOS培训..Net培训.期待与您交流! --- IO流中有四大体系: 字符流:Reader和 Writer 字节流:InputStream和OutputSream 基于这四大体系,io流中衍生出许多对象,常见的有FileReader,FileWriter,FileInputStream,FileOutputStream,BufferedInputStream等等. 除此之外,还有其他一些常见的对象,这些对象比较特殊,往往是针对某些特定功能的.我们在应用中凡