8、SequenceInputStream
表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
案例:媒体文件切割与合并
1 import java.io.File;
2 import java.io.FileInputStream;
3 import java.io.FileOutputStream;
4 import java.io.IOException;
5 import java.util.Properties;
6
7 public class CutFile {
8 /**
9 * 将一个媒体文件切割成碎片
10 * 思路:1、读取源文件,将源文件的数据分别复制到多个文件
11 * 2、切割方式有两种:按照碎片个数切,或者按照指定大小切
12 * 3、一个输入流对应多个输出流
13 * 4、每个碎片都需要编号,顺序不能错
14 * @throws IOException
15 */
16 public static void main(String[] args) throws IOException {
17 File srcFile=new File("C:\\Users\\Administrator\\Desktop\\Test\\img.jpg");
18 File partsDir=new File("C:\\Users\\Administrator\\Desktop\\cutFiles");
19 splitFile(srcFile,partsDir);
20
21 }
22 //切割文件
23 private static void splitFile(File srcFile, File partsDir) throws IOException {
24 if(!(srcFile.exists()&&srcFile.isFile())) {
25 throw new RuntimeException("源文件不是正确文件或者不存在");
26 }
27 if(!partsDir.exists()) {
28 partsDir.mkdirs();
29 }
30 FileInputStream fis=new FileInputStream(srcFile);
31 FileOutputStream fos=null;
32
33 byte[] buf=new byte[1024*60];
34
35 int len=0;
36 int count=1;
37 while((len=fis.read(buf))!=-1) {
38 //存储碎片文件
39 fos=new FileOutputStream(new File(partsDir,(count++)+".part"));
40 fos.write(buf, 0, len);
41 fos.close();
42 }
43 /*将源文件和切割的信息也保存起来,随着碎片文件一起发送
44 * 信息:源文件的名称
45 * 碎片的个数
46 *将这些信息单独封装到一个文件中
47 *还要一个输出流完成此操作 */
48
49 String fileName=srcFile.getName();
50 int partCount=count;
51 fos=new FileOutputStream(new File(partsDir,count+".properties"));
52 // fos.write(("fileName="+fileName+System.lineSeparator()).getBytes());
53 // fos.write(("fileCount="+Integer.toString(partCount)).getBytes());
54 Properties prop=new Properties();
55 prop.setProperty("fileName", srcFile.getName());
56 prop.setProperty("partCount", Integer.toString(partCount));
57 //将属性集中的信息持久化
58 prop.store(fos, "part file info");
59 fis.close();
60 fos.close();
61
62 }
63 }
CutFile
1 import java.io.File;
2 import java.io.FileFilter;
3 import java.io.FileInputStream;
4 import java.io.FileNotFoundException;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
7 import java.io.SequenceInputStream;
8 import java.util.ArrayList;
9 import java.util.Collections;
10 import java.util.Enumeration;
11 import java.util.List;
12 import java.util.Properties;
13
14 public class mergeFile {
15 public static void main(String[] args) throws IOException {
16 File pathDir=new File("C:\\Users\\Administrator\\Desktop\\cutFiles");
17 //获取配置文件
18 File configFile=getconfigFile(pathDir);
19 //获取配置文件信息的属性集
20 Properties prop=getProperties(configFile);
21 System.out.println(prop);
22 //获取属性集信息,将属性集信息传递到合并方法中
23 merge(pathDir,prop);
24 }
25
26 private static Properties getProperties(File configFile) throws IOException {
27 FileInputStream fis=null;
28 Properties prop=null;
29 try {
30 //读取流和配置文件相关联
31 fis=new FileInputStream(configFile);
32 prop=new Properties();
33 //流中的数据加载到集合中
34 prop.load(fis);
35 }finally {
36 if(fis!=null) {
37 fis.close();
38 }
39 }
40 return prop;
41 }
42
43 public static File getconfigFile(File pathDir) {
44 //判断是否存在properties文件
45 if(!(pathDir.exists()&&pathDir.isDirectory())) {
46 throw new RuntimeException(pathDir.toString()+"不是有效目录");
47 }
48 File[] files=pathDir.listFiles(new FileFilter() {
49 @Override
50 public boolean accept(File pathname) {
51 return pathname.getName().endsWith(".properties");
52 }
53
54 });
55 if(files.length!=1) {
56 throw new RuntimeException(pathDir.toString()+"properties扩展名的文件不存在或者不唯一");
57 }
58 File configFile=files[0];
59 return configFile;
60 }
61
62 public static void merge(File pathDir, Properties prop) throws FileNotFoundException, IOException {
63 String fileName=prop.getProperty("fileName");
64 int partCount=Integer.valueOf(prop.getProperty("partCount"));
65 List<FileInputStream> list=new ArrayList<FileInputStream>();
66 for(int i=1;i<partCount;i++) {
67 list.add(new FileInputStream(pathDir.toString()+"\\"+i+".part"));
68 }
69 //List自身无法获取Enumeration工具类,到Collection中找
70 Enumeration<FileInputStream> en=Collections.enumeration(list);
71 SequenceInputStream sis=new SequenceInputStream(en);
72 FileOutputStream fos=new FileOutputStream(pathDir.toString()+"\\"+fileName);
73 byte[] buf=new byte[1024];
74 int len=0;
75 while((len=sis.read(buf))!=-1) {
76 fos.write(buf,0,len);
77 }
78 fos.close();
79 sis.close();
80 }
81
82 }
mergeFile

该博客展示了如何使用Java进行媒体文件的切割和合并。通过SequenceInputStream实现了多个输入流的逻辑串联,先将文件切割成多个碎片,每个碎片编号并保存相关信息,然后根据这些信息合并回原始文件。
https://www.bilibili.com/video/BV1qL411u7eE?spm_id_from=333.999.0.0
599

被折叠的 条评论
为什么被折叠?



