JavaIO - 序列流

1. SequenceInputStream

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

SequenceInputStream 可以认为是一个工具类,将两个或者多个输入流当成一个输入流依次读取。完全可以从 IO 包中去除,还完全不影响 IO 包的结构,却让其更 “纯洁” ――纯洁的 Decorator 模式。

1-1. 序列流应用

  • 序列流只负责源。对多个流进行合并。
  • 切割or合并。将一个文件切割成多个文件 && 将多个文件碎片合并成一个文件。

1-2. SequenceInputStream序列流的步骤

  1. 找到目标文件
  2. 建立数据输入输出通道
  3. 建立序列流对象
  4. 关闭资源

2. 实例

- 切割MP3:

public static void cutFile() throws IOException{
    File file = new File("E:\\Music\\忘尘谷.mp3");
    //目标文件夹
    File dir = new File("E:\\MyMusic");
    //建立数据输入通道
     FileInputStream fis = new FileInputStream(file);
    //建立缓冲数组
    byte[] buf = new byte[1024*1024];//1024*1024 = 1MB,即:把该音乐切割成每份1MB的大小
    int length = 0;
    //边读边写
    for (int i = 0; (length=fis.read(buf)) != -1; i++) {//读 (每次读1MB)
        FileOutputStream fos = new FileOutputStream(new File(dir,"wcg"+i+".mp3"));//建立数据输出通道
        fos.write(buf, 0, length);//
        fos.close();
    }
    fis.close();
}

- 合并MP3:

public static void mergeFile() throws IOException{
    //找到目标文件
    File dir = new File("E:\\MyMusic");
    //通过目标文件找到所有mp3,然后把这些mp3添加到vector集合中
    Vector<FileInputStream> vector = new Vector<FileInputStream>();
    File[] file = dir.listFiles();
    for (File file2 : file) {
        if(file2.getName().endsWith(".mp3")){//获取以.mp3结尾的文件名
            vector.add(new FileInputStream(file2));//添加到vector集合中
        }
    }
    Enumeration<FileInputStream> e = vector.elements();//返回此向量组件的枚举。即把上面集合中的元素给了e对象
    SequenceInputStream sis = new SequenceInputStream(e);//建立序列流对象//建立缓冲数组读取文件
    byte[] buf = new byte[1024];
    int length = 0;
    FileOutputStream fos = new FileOutputStream(new File("MyMusic\\MergeMusic\\合并音乐-忘尘谷.mp3"));//建立输出字节流
    while((length = sis.read(buf)) != -1){//
        fos.write(buf, 0, length);//
    }
    fos.close();
    sis.close();
}
posted @ 2020-03-11 12:51  ohmok  阅读(159)  评论(0)    收藏  举报