合并流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



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


相关文章
|
3月前
|
SQL 存储 数据库连接
【Azure Stream Analystics】流分析服务执行遇见警告错误消息,导致上游数据堆积,下游无任何输出
【Azure Stream Analystics】流分析服务执行遇见警告错误消息,导致上游数据堆积,下游无任何输出
【Azure Stream Analystics】流分析服务执行遇见警告错误消息,导致上游数据堆积,下游无任何输出
|
4月前
|
存储 数据处理 流计算
流模式vs批模式:你选对了吗?
本文由阿里云 Flink 团队刘文聪老师在撰写。文章分析了 Flink 的流批模式在不同维度存在的特点与差异,帮助开发者朋友们更好地理解 Flink 的流批模式。
586 12
流模式vs批模式:你选对了吗?
|
3月前
什么是时间流
什么是时间流
56 0
|
6月前
|
存储 C++ iOS开发
C++ 文件和流
C++ 文件和流
41 0
|
6月前
|
传感器 SQL Java
Flink撤回机制问题之撤回机制不起作用如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
|
6月前
|
程序员 C++ iOS开发
c++文件和流
c++文件和流
37 0
|
存储 Java
流及其相关操作
流及其相关操作
|
存储 Java
16 文件与流
16 文件与流
59 0
|
消息中间件 存储 网络协议
大厂都是如何处理重复消息的?
消息消费失败,很多框架会自动执行重试,而重试就产生了重复消息。 MQTT协议给出三种传递消息时能够提供的
278 0