JavaSE笔记15.10-IO流-SequenceInputStream

本文深入探讨Java SE中的SequenceInputStream,一种用于合并多个字节输入流的序列流。文章介绍了SequenceInputStream的构造方法及如何使用Enumeration接口进行实例化,通过两个实例演示了如何将多个文件内容合并到一个文件中。
摘要由CSDN通过智能技术生成

一. 概述

序列流SequenceInputStream:
表示其他输入流的逻辑串联,可对多个字节输入流进行合并。

1. 构造方法

//按顺序读取2个字节输入流,先读取s1,再读取s2
SequenceInputStream(InputStream s1,InputStream s2);
//按顺序读取由枚举产生的字节输入流
SequenceInputStream(Enumeration<? extends InputStream> e);

2. Enumeration接口

  • 是最早的迭代输出接口,最早使用Vector时就是使用Enumeration接口进行输出的
  • 功能与Iterator类似,只是Enumeration中不存在删除数据的方法
  • 通过调用hasMoreElements方法判断是否包含更多元素,通过调用nextElement方法返回系列的连续元素
public interface Enumeration<E>

//判断此枚举是否包含更多元素
boolean hasMoreElements();
//返回此枚举的下一个元素
E nextElement();
  • 要想使用此接口可以通过Vector类,Vector类定义了elements方法可以为Enumeration实例化
public class Vector<E>

//返回此向量的组件的枚举
Enumeration<E> e=vector.elements();

二. 练习

1. Enumeration接口通过Vector类进行实例化

将1.txt、2.txt、3.txt这3个文件的内容合并到4.txt上

import java.util.*;
import java.io.*;
public class SequenceInputStreamDemo {
    public static void main(String[] args) {
        try{
            sequenceStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private static void sequenceStream()throws IOException{
        //1. 定义一个Vector集合
        Vector<FileInputStream> v=new Vector<FileInputStream>();
        v.add(new FileInputStream("C:\\1.txt"));
        v.add(new FileInputStream("C:\\2.txt"));
        v.add(new FileInputStream("C:\\3.txt"));

        //2. 通过Vector集合的elements方法实例化Enumeration
        Enumeration<FileInputStream> en=v.elements();

        //3. 使用SequenceInputStream的构造方法实例化对象,参数是Enumeration对象
        SequenceInputStream sis=new SequenceInputStream(en);

        FileOutputStream fos=new FileOutputStream("C:\\4.txt");
        byte[] buf=new byte[1024];
        int len=0;
        while ((len=sis.read(buf))!=-1){
            fos.write(buf,0,len);
        }
        fos.close();
        sis.close();
    }
}

2. Enumeration接口通过匿名内部类实现

不使用Vector来实例化Enumeration接口,而是通过匿名内部类实现Enumeration接口

import java.util.*;
import java.io.*;
public class SplitFileDemo {
    public static void main(String[] args) {
        try {
            //切割文件
            splitFile();
            //合并文件
            mergeFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //合并文件
    private static void mergeFile() throws IOException {
        //1. 定义一个ArrayList集合,存放多个输入流
        ArrayList<FileInputStream> al=new ArrayList<FileInputStream>();
        for(int i=1;i<=9;i++){
            al.add(new FileInputStream("C:\\splitFiles\\"+i+".part"));
        }
        Iterator<FileInputStream> it=al.iterator();

        //2. 匿名内部类实现Enumeration接口
        Enumeration<FileInputStream> en=new Enumeration<FileInputStream>() {
            @Override
            public boolean hasMoreElements() {
                return it.hasNext();
            }

            @Override
            public FileInputStream nextElement() {
                return it.next();
            }
        };

        //3. 使用SequenceInputStream的构造方法实例化对象,参数是Enumeration对象
        SequenceInputStream sis=new SequenceInputStream(en);
        FileOutputStream fos=new FileOutputStream("2.mp4");
        int len=0;
        byte[] buf=new byte[1024*1024];
        while ((len=sis.read(buf))!=-1){
            fos.write(buf,0,len);
        }
        fos.close();
        sis.close();
    }

    //切割文件
    private static void splitFile() throws IOException {
        FileInputStream fis=new FileInputStream("1.mp4");
        FileOutputStream fos=null;

        //将文件1.mp4按照1MB大小进行切割
        byte[] buf=new byte[1024*1024];
        int len=0;
        int count=1;
        while ((len=fis.read(buf))!=-1){
            fos=new FileOutputStream("C:\\splitFiles\\"+(count++)+".part");
            fos.write(buf,0,len);
            fos.close();
        }
        fis.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值