合并流SequenceInputStream和回退流PushbackInputStream(十)

简介: 合并流SequenceInputStream和回退流PushbackInputStream(十)

一. 合并流 SequenceInputStream


Java可以将 两个文件,或者多个文件 合并到一个文件。 注意,如果是两个文件进行合并,合并后的文件是三个, 如A +B 合并, 那么会合并到 C, 共有 A,B,C 三个文件。


那么,你说如何将 A文件合并到B文件,而不产生C 文件呢。 这个与文件复制差不多, 需要让目的地文件即B 存在,并且有数据, 在实例化FileOutputStream时,用追加, append=true 的方式进行读取就可以了, 就可以将A 文件合并到B 文件里面了。


这儿 SequenceInputStream 讨论的是 产生 最后的结果文件 C 文件。


一.一 方法


一.一.一 构造方法


一.一.一.一 方法


image.png


一.一.一.二 演示


   @Test
    public void conTest() throws Exception{
        //1. 定义两个输入流
        File file1=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"out.txt");
        InputStream in1=new FileInputStream(file1);
        File file2=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"err.txt");
        InputStream in2=new FileInputStream(file2);
        //第一种方式
        SequenceInputStream sequenceInputStream=new SequenceInputStream(in1,in2);
        //第二种,传入多个合并源
        Vector<InputStream> vector=new Vector<>();
        vector.add(in1);
        vector.add(in2);
        //变成集合
        Enumeration<InputStream> inputStreamEnum=vector.elements();
        //传入集合
        SequenceInputStream sequenceInputStream1=new SequenceInputStream(inputStreamEnum);
    }


一.一.二 普通读取方法


image.png


一.二 演示合并流 SequenceInputStream


合并源一: out.txt 文件内容


20200618172001557.png


合并源二: err.txt 文件内容


20200618172005176.png


@Test
    public void seqTest() throws Exception{
        //1. 定义两个输入流
        File file1=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"out.txt");
        InputStream in1=new FileInputStream(file1);
        File file2=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"err.txt");
        InputStream in2=new FileInputStream(file2);
        //合并流
        SequenceInputStream sequenceInputStream=new SequenceInputStream(in1,in2);
        //结果文件
        File file3=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"hebing.txt");
        OutputStream outputStream=new FileOutputStream(file3);
        byte[] bytes=new byte[1024];
         int len=-1;
         while((len=sequenceInputStream.read(bytes))!=-1){
             outputStream.write(bytes,0,len);
         }
         outputStream.close();
         sequenceInputStream.close();
         in1.close();
         in2.close();
    }


运行程序, 查看 hebing.txt 文件内容


20200618172010905.png


二. 回退流 PushbackInputStream


以前读取文件 inputStream.read(), 或者 inputStream.read(b) 时,只能往前读,不能往后退,读过去就过去了。 然而,有时候,可能误读之类的,需要回退。 那么就用到 回退流 PushbackInputStream 了。


二.一 方法


二.一.一 构造方法


二.一.一.一 方法


image.png


二.一.一.二 演示


 @Test
    public void conTest() throws Exception{
        //读内存,不读文件了
        InputStream inputStream=new ByteArrayInputStream("你好啊".getBytes("UTF-8"));
        PushbackInputStream pushbackInputStream=new PushbackInputStream(inputStream);
    }


二.一.二 读和回退方法


image.png


二.二 演示回退流 PushbackInputStream


 @Test
    public void pushTest() throws Exception{
        String str="Hello,EveryOne,My Name is,TwoBu,tterfly";
        InputStream inputStream=new ByteArrayInputStream(str.getBytes("UTF-8"));
        //构建回退流
        PushbackInputStream pushbackInputStream=new PushbackInputStream(inputStream,8);
        int len=-1;
        System.out.println("输出内容:");
        while((len=pushbackInputStream.read())!=-1){
            //有值
            char c=(char)len;
            if(c==','){
                //为 ,号时 ,先往前读3个,再往后倒两个
                byte[] b1=new byte[3];
                pushbackInputStream.read(b1);
                //往后倒两个
                pushbackInputStream.unread(b1,0,2);
            }else{
                System.out.print(c);
            }
        }
    }


运行程序,控制台打印输出:


20200618172017692.png


回退分析:


Hello,EveryOne,My Name is,TwoBu,tterfly


第一个, 号时, 往前读取三个,读了 Eve, 又往后回退两个, 回退 Ev, 即将 Ev 重新放置到缓冲区去, 而e 没有放置,e丢失了。


第二个, 号时, My空格 读取这三个, My回退到缓冲区,空格丢失。


第三个,号时,Two 读取这三个, Tw回退到缓冲区,o丢失.


第四个,号时 tte读取这三个, tt回退到缓冲区, e失去。


所以最后结果是: HelloEvryOneMyName isTwButtrfly



谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!


相关文章
|
1月前
|
程序员 C++ iOS开发
c++文件和流
c++文件和流
17 0
|
5月前
流的关闭的几种方式
流的关闭的几种方式
|
9月前
|
存储 Java
流及其相关操作
流及其相关操作
|
11月前
|
存储 Java
16 文件与流
16 文件与流
42 0
|
Linux Windows
流的定位
流的定位
63 0
有关截取数据集合分批请求的操作
有关截取数据集合分批请求的操作
65 0
|
SQL 存储 运维
FLIP-147:支持包含结束任务的 Checkpoint 操作与作业结束流程修正
为了完善流执行模式对有限数据流的支持,所进行的改动以及更详细的实现。
FLIP-147:支持包含结束任务的 Checkpoint 操作与作业结束流程修正
|
存储 SQL Cloud Native
低延迟流复制
在PolarDB云原生架构下,低延迟也发挥了作用的作用。
低延迟流复制
一个H264流,保存成多个文件需要注意的两个问题
一个H264流,保存成多个文件需要注意的两个问题
151 0