第五篇:Java——利用IO流和Vector集合实现文件的拆分与合并

第五篇:Java——利用IO流和Vector集合实现文件的拆分合并

----------------------------------------------------------------------------------------------------------
今天我们来给大家演示一下如何使用IO流和Vector集合去实现一个文件的拆分和合并,这里我们使用音频文件来演示
首先,我们要知道,IO流分为字节流和字符流。因为音频文件不是字符类文件,所以只能使用字节流来操作,字节流中有一个比较特殊的流叫做SequenceInputStream,他可以按照顺序输入字节数据,具体的使用方法以及构造可以查API,这里就不做过多解释了。那么为什么选用Vector集合呢。是因为Vector集合中有一个方法v.elements()可以得到集合中的所有项。那么下面我们就来看下这个例子,具体的了解一下是如何拆分合并文件的:
例1:将一个music.mp3文件,拆分成多个小文件, 再将多个小文件, 合并成一个mp3文件. 假如一份拆成 1M , 总共拆分五份 ,剩下的为最后一份;最后将5份再合成一份。
代码如下:

public class Test {
	//主方法
    public static void main(String[] args) throws IOException {
        //调用拆分方法
        chaifen();
        //调用合并方法
        hebing();
    }

    //1.拆分
    private static void chaifen() throws IOException {
        //new一个输入流将源文件封装,后面参数写原文件的地址和文件名
        FileInputStream in = new FileInputStream(new File("F:\\夜夜夜夜.mp3"));
        //再封装一个新的文件夹,用来存储拆分后的五个音频文件
        File file = new File("F:\\音乐");
        //判断一下有没有这个文件夹,如果没有则新建
        if (!file.exists()){
            file.mkdirs();
        }
        //新建一个缓冲数组,用来存储输入流的字节,这里设置1024*104为1M,因为我们想要分成五分
        byte[] bytes = new byte[1024 * 1024];
        //设置一个标记,开始值为0
        int len = 0;
        //设置五个小音频文件的名字,我们这里采用数字++的方法,当然你们也可以设置随机数,随机字符串
        int minName=1;
        //循环输出缓冲数组里的字节,前四次为1M,最后一次为0.36M。当读不到字节数时默认返回-1,所以我们这里让他不等于-1
        while ((len = in.read(bytes))!=-1){
            //new一个输出流,从缓冲数组中一次拿1M存储到小音频文件中
            FileOutputStream out = new FileOutputStream(new File(file, (minName++) + ".mp3"));
            out.write(bytes);
            //刷新一下
            out.flush();
            //在里面关闭输出流,保证输出流在存储完1M之后关闭
            out.close();
        }
        in.close();
    }

    //2.合并
    private static void hebing() throws IOException {
        //封装装有5个小音频的文件夹
        File file1 = new File("F:\\音乐");
        //获取文件
        File[] files = file1.listFiles();
        //new一个Vector集合,泛型定为字节输入流
        Vector<FileInputStream> v = new Vector<>();
        //遍历获取的文件
        for (File f : files) {
            //如果遍历的文件是文件类型且后缀名为.mp3,就new一个字节输出流将所有文件加入集合中
            if (f.isFile()&&f.getName().endsWith(".mp3")){
                FileInputStream inputStream = new FileInputStream(f);
                v.add(inputStream);
            }
        }
        //new一个顺序字节输入流SequenceInputStream,将集合中元素出传入流中
        SequenceInputStream in = new SequenceInputStream(v.elements());
        //new一个字节输出流,将合并后的文件路径与文件名定义好
        FileOutputStream out = new FileOutputStream("F:\\新--夜夜夜夜.MP3");
        //new一个缓冲区数组,这里的缓冲区是用来提升写入速度的,一般定义为8k,相当于一次存入8k
        byte[] bytes = new byte[1024 * 8];
        //定义一个标记
        int len = 0;
        //利用循环写入数据
        while ((len=in.read(bytes))!=-1){
            out.write(bytes);
            //刷新
            out.flush();![在这里插入图片描述](%5D%7DB7P2YLIL~H~ZEKX@NLH4Q.png)
        }
        //关闭输入输出流
        out.close();
        in.close();

    }

}
输出效果:
-------------拆分后:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190119213036657.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNDExNTUw,size_16,color_FFFFFF,t_70)
-------------合并后:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019011921291220.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNDExNTUw,size_16,color_FFFFFF,t_70)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值