零基础java自学流程-Java语言高级516

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

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

尚学堂给同学们带来全新的Java300集课程啦!java零基础小白自学Java必备优质教程_手把手图解学习Java,让学习成为一种享受_哔哩哔哩_bilibili尚学堂给同学们带来全新的Java300集课程啦本课程为Java300集2022版第一季,配合最新版的Java课程,所有视频重新录制,课件所有图形做了重新绘制和配色,图解学习Java,让学习成为一种享受本套教程专门为零基础学员而制,适合准备入行Java开发的零基础学员,视频中穿插多个实战项目。每一个知识点都讲解的通俗易懂,由浅入深。不仅适用于零基础的初学者,有经验的程序员也可做巩固学习。后续课https://www.bilibili.com/video/BV1qL411u7eE?spm_id_from=333.999.0.0

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值