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



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


相关文章
|
网络协议 算法 Linux
TCP 协议报文格式&tcpdump抓包工具
之前文章介绍过 wireshark 抓包工具的 捕获过滤器 和 显示过滤器,而 捕获过滤器 使用的 BPF 过滤语法可以在 tcpdump 中使用,tcpdump 可以在 Linux 服务端使用,熟悉和了解 tcpdump 抓包工具的使用,可以帮助分析服务端数据报文的情况。
780 0
|
11月前
|
监控 数据可视化 定位技术
全面解读团队目标管理的6种常见方法(附OKR管理模板)
3分钟搞懂6种实用目标管理方法,包括SMART、OKR、KPI、BSC、里程碑等方法。
1053 2
全面解读团队目标管理的6种常见方法(附OKR管理模板)
|
缓存 并行计算 Linux
深入解析Linux操作系统的内核优化策略
本文旨在探讨Linux操作系统内核的优化策略,包括内核参数调整、内存管理、CPU调度以及文件系统性能提升等方面。通过对这些关键领域的分析,我们可以理解如何有效地提高Linux系统的性能和稳定性,从而为用户提供更加流畅和高效的计算体验。
512 24
|
数据采集 监控 API
如何监控一个程序的运行情况,然后视情况将进程杀死并重启
这篇文章介绍了如何使用Python的psutil和subprocess库监控程序运行情况,并在程序异常时自动重启,包括多进程通信和使用日志文件进行断点重续的方法。
|
自然语言处理 算法 Java
Java如何判断两句话的相似度?
【8月更文挑战第28天】Java如何判断两句话的相似度?
852 62
|
JSON 数据格式
@SpringQueryMap 、@RequestPart 、@RequestParam 比较与说明
@SpringQueryMap 、@RequestPart 、@RequestParam 比较与说明
1216 2
|
API Nacos 数据库
Nacos配置问题之启动项目报错如何解决
Nacos是一个开源的、易于部署的动态服务发现、配置管理和服务管理平台,旨在帮助微服务架构下的应用进行快速配置更新和服务治理;在实际运用中,用户可能会遇到各种报错,本合集将常见的Nacos报错问题进行归纳和解答,以便使用者能够快速定位和解决这些问题。
6113 104
QR Code
【6月更文挑战第12天】
1677 1
|
IDE 程序员 开发工具
IDEA插件-Material Theme UI/IDEA最强主题插件/IDEA图标美化
"Material Theme UI" 是一个用于 JetBrains IDE(如 IntelliJ IDEA、WebStorm、Android Studio 等)的插件,它将原始外观改为 Material Design 风格,并提供丰富的选项来根据个人喜好配置 IDE。
5062 0
IDEA插件-Material Theme UI/IDEA最强主题插件/IDEA图标美化
|
SQL Java 关系型数据库
【MyBatis-Plus】快速精通Mybatis-plus框架—核心功能
【MyBatis-Plus】快速精通Mybatis-plus框架—核心功能
1180 0
【MyBatis-Plus】快速精通Mybatis-plus框架—核心功能