Java之节点流和处理流(Buffered字节字符处理流)

news2024/11/24 3:11:14

文章目录

  • 前言
  • 基本介绍
  • Buffered字符处理流
    • BufferedReader缓冲字符输入流
    • BufferedWriter缓冲字符输出流
    • 文件拷贝
  • Buffered字节处理流
    • 文件拷贝(二进制文件)
  • 处理流关闭问题

前言

Java中的流按照功能可以分为节点流和处理流。其中节点流是直接用来访问数据源,而数据源又分为文件、内存、管道(线程间通信使用),所以就需要不同的类来进行处理。每次从数据源中读取的数据单位又可以分为字节和字符。


基本介绍

节点流:可以从一个特定的数据源读写数据,如FileReader、FileWriter等(程序用于直接操作目标设备所对应的类)
在这里插入图片描述

处理流:是“连接”已存在的流(节点流和处理流)之上,为程序提供强大的读写功能,更加灵活。 程序通过一个间接流类去调用节点流类,以达到更加灵活方便地读写各种类型的数据,这个间接流类就是处理流(也叫包装流,对节点流进行包装)如BufferedReader 、BufferedWriter等

处理流中可以封装一个节点流,该节点流可以是任意的,只要是处理流父类的子类!

在这里插入图片描述

节点流和处理流流览图

在这里插入图片描述
区别:

  • 节点流是底层流/低级流,直接跟数据源相接
  • 处理流(包装流)包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出
  • 处理流对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连

处理流设计模式模拟

public abstract class Reader_ {//抽象类

    public void readFile() {
    }

    public void readString() {
    }
}

class FileReader_ extends Reader_ {
    public void readFile() {
        System.out.println("对文件进行读取...");
    }
}

class StringReader_ extends Reader_ {//节点流l
    public void readString() {
        System.out.println("读取字符串...");
    }
}

/**
 * 做成处理流,也叫包装流
 */
class BufferedReader_ extends Reader_ {
    private Reader_ reader_;//属性就是Reader_类型

    public BufferedReader_(Reader_ reader_) {
        this.reader_ = reader_;
    }
    //让方法更加灵活,多次读取文件 扩展
    public void readFiles(int num) {
        for (int i = 0; i < num; i++) {
            reader_.readFile();
        }
    }
    //扩展readString,批量处理字符串数据
    public void readStrings(int num) {
        for (int i = 0; i < num; i++) {
            reader_.readString();
        }
    }
    @Override
    public void readFile() {
        reader_.readFile();
    }
    @Override
    public void readString() {
        reader_.readString();
    }
}

class Test_ {
    public static void main(String[] args) {
        //使用节点流
        BufferedReader_ bufferedReader_ = new BufferedReader_(new FileReader_());
        bufferedReader_.readFile();
        bufferedReader_.readFiles(10);
        BufferedReader_ bufferedReader_1 = new BufferedReader_(new StringReader_());
        bufferedReader_1.readStrings(10);
    }
}

处理流的功能:

  • 性能的提高:主要以增加缓冲的方式来提高输入输出的效率
  • 操作的便捷:操作更加灵活方便

Buffered字符处理流

常见的两个字符处理流(属于字符流,按照字符来读取数据的)

  • BufferedReader:从字符输入流中读取文本并缓冲字符,以便有效地读取字符,数组和行

    可以通过构造函数指定缓冲区大小也可以使用默认大小。

  • BufferedWriter:将文本写入字符输出流,缓冲字符,以便有效地写入单个字符,数组和字符串。

因为有缓冲区所以很效率比没有缓冲区的很高,在关闭处理流时,是需要关闭外层流即可(底层会自动关闭节点流的)


BufferedReader缓冲字符输入流

BufferedReader类下有一个Reader属性,它用于存放Reader类下的流,包装操作
在这里插入图片描述
在这里插入图片描述

BufferedReader提供了两个构造器,根据不同的场景进行选择

  • BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流
  • BufferedReader(Reader in, int sz) 创建一个使用指定大小的输入缓冲区的缓冲字符输入流。

示例
使用BufferedReader读取文本文件,并显示在控制台,readLine按行读取文件(BufferedReader类下的方法),当返回null时,表示读取完毕。
在这里插入图片描述

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReader_ {
    public static void main(String[] args) throws IOException {//throws对异常进行处理的方式
        String filePath = "E:\\Utility.java";
        //创建BufferedReader对象
        BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
        //BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath,true));追加模式
        //读取
        String line;//按行读取,效率高
        while ((line = bufferedReader.readLine())!=null){
            System.out.println(line);
        }
        bufferedReader.close();
    }
}

此时控制台输出E盘下的Utility.java的内容


BufferedWriter缓冲字符输出流

BufferedWriter类中的Writer属性与BufferedReader中的Reader属性同理!

BufferedWriter提供了两个构造器,根据不同的场景进行选择

  • BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流
  • BufferedWriter(Writer out, int sz) 创建一个新的缓冲字符输出流,该流使用给定大小的输出缓冲区

在这里插入图片描述

通过BufferedWriter写入文件字符串,此代码演示使用的是writer(String str),writer可以写入多种数据,具体方法可进行百度或者查看JDK文档

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWRITER_ {
    public static void main(String[] args) throws IOException {//throws对异常进行处理
        String filePath = "E:\\hello.txt";
        //创建一个BufferedWriter
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath));
        bufferedWriter.write("hello1");
        bufferedWriter.newLine();//插入一个换行
        bufferedWriter.write("hello2");
        bufferedWriter.newLine();//插入一个换行
        bufferedWriter.write("hello3");
        bufferedWriter.close();
    }
}

此时E盘下的hello.txt文本内容为:
hello1
hello2
hello3
切换FileWriter的构造器,可以将覆盖模式改为追加模式

文件拷贝

将D盘下的hello.txt文本拷贝到E盘下

import java.io.*;

public class bufferedCopy_ {
    public static void main(String[] args) throws IOException {
        String srcFilePath  = "D:\\hello.txt";//源
        String destFilePath  = "E:\\hello.txt";//要拷贝的目录
        BufferedReader bufferedReader1 = new BufferedReader(new FileReader(srcFilePath));
        BufferedWriter bufferedReader2 = new BufferedWriter(new FileWriter(destFilePath));
        String temp;
        while ((temp = bufferedReader1.readLine())!=null){
            bufferedReader2.write(temp);
            bufferedReader2.newLine();//换行
        }
        bufferedReader1.close();
        bufferedReader2.close();
        System.out.println("拷贝成功");
    }
}

注意:如果拷贝的是二进制文件,则会乱码损毁(BufferedReader和BufferedWriter不要去操作二进制文件)


Buffered字节处理流

按照字节进行处理,常见的两个字节处理流(属于字节流,读取二进制数据)

  • BufferedInputStream缓冲字节输入流
  • BufferedOutputStream缓冲字节输出流

在这里插入图片描述

由此流览图可知字节处理流可字符处理流类似,构造器中是各自父类或子类的实现对象!

文件拷贝(二进制文件)

将D盘下的mbg图片拷贝到E盘下

演示使用BufferedInputStream和BufferedOutputStream拷贝二进制文件

import java.io.*;

public class bufferedCopy {
    public static void main(String[] args) {
        String srcPath = "D:\\mbg.png";//要拷贝的文件
        String destPath = "E:\\mbg.png";//要拷贝到哪里
        BufferedInputStream bufferedInputStream1 = null;
        BufferedOutputStream bufferedOutputStream2 = null;
        try {
            bufferedInputStream1 = new BufferedInputStream(new FileInputStream(srcPath));
            bufferedOutputStream2 = new BufferedOutputStream(new FileOutputStream(destPath));
            byte[] bytes = new byte[1024];
            int readLen = 0;
            while ((readLen = bufferedInputStream1.read(bytes))!=-1){
                bufferedOutputStream2.write(bytes,0,readLen);
            }
            System.out.println("拷贝成功");
        } catch (IOException e) {
            e.getMessage();//输出异常
        } finally {
            try {
                bufferedInputStream1.close();//关闭流,释放资源
                bufferedOutputStream2.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

处理流关闭问题

在关闭处理流时,是需要关闭外层流即可(底层会自动关闭节点流的)

当我们在 bufferedReader.close() 处下断点时
在这里插入图片描述
一路真正代码执行,发现底层会自动调用close方法对节点流进行关闭
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/168585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GO的interface的使用和反射

博客主页&#xff1a;&#x1f3c6;看看是李XX还是李歘歘 &#x1f3c6; &#x1f33a;每天不定期分享一些包括但不限于计算机基础、算法、后端开发相关的知识点&#xff0c;以及职场小菜鸡的生活。&#x1f33a; &#x1f497;点关注不迷路&#xff0c;总有一些&#x1f4d6;知…

自动化测试

一、关于自动化什么是自动化?扫地机器人 自动浇水机 自动洗手液 智能马桶... &#xff0c;能够有效的减少人力的消耗&#xff0c;同时提高生活质量。而自动化测试同样&#xff0c;能够有效减少人力的投入&#xff0c;同时提高了测试的质量和效率。回归测试&#xff0c;版本越来…

23.Isaac教程--Isaac导航

Isaac导航 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 节点和消息 Isaac 应用程序由多个节点创建。 导航堆栈具有以下节点&#xff1a; GlobalLocalization&#xff1a;在没有先验信息的情况下&#xff0c;仅使用当前范围扫描测量来估计地…

【JavaGuide面试总结】MySQL篇·上

【JavaGuide面试总结】MySQL篇上1.SQL语句在MySQL中的执行过程MySQL架构Server 层基本组件介绍查询语句分析更新语句分析总结2.MySQL更新语句为什么要用两个日志模块&#xff0c;用一个日志模块不行吗?3.MySQL 支持哪些存储引擎&#xff1f;默认使用哪个&#xff1f;4.MySQL 存…

虹科分享 | TSN时间敏感网络测试框架

一、时间敏感网络 时间敏感网络&#xff08;TSN&#xff09;允许合并OT和IT世界&#xff0c;并保证确定性以太网网络中所有设备的互操作性和标准化。TSN建立在一个真正成熟的生态系统中&#xff08;如以太网&#xff09;&#xff0c;因此大家认为TSN将是下一代工业网络通信的核…

top命令详解

1. 命令参数 d : 监控内容刷新的时间间隔。 n : 限定监控内容刷新的次数&#xff0c;完成后将会退出 top 视图。 p : 只监控指定PID的进程。 -b : 以非交互非全屏模式运行&#xff0c;一般配合-n指定输出几次统计信息&#xff0c;将输出重定向到指定文件&#xff0c;比如 top …

二分查找----C/C++

目录 1. 二分查找的概念 2. 整数的二分 2.1 二分的模版一 2.2 二分的模版二 2.3. 案例剖析 2.4.整数二分总结 3. 浮点数的二分 1. 二分查找的概念 折半查找(BinarySearch)技术&#xff0c;又称为二分查找。它的前提是线性表中的记录 必须是关键码有序(通常从小到大有序)&a…

mysql 分库分表、 分区(partition)、sharding-sphere 综合整理

引言&#xff1a; 一般情况下&#xff0c;如果单表数据量超过2000w的样子查询速度会很慢&#xff0c;因为内存无法存储其索引&#xff0c;使得之后的 SQL 查询会产生磁盘 IO&#xff0c;从而导致性能下降。解决方案&#xff1a;mysql 分区 、 分表处理 分库分表&#xff1a; 原…

【匠心打造】从0打造uniapp 可视化拖拽设计 c_o 第六篇

1、这个版本的变化是左侧增加了布局设计和包资源管理器 包资源管理器&#xff1a;eclipse的特称&#xff0c;左侧的项目管理。和hbuildx左侧类似 项目的整体设计结构如下: v1.0 普通模式&#xff1a;支持新建前端项目&#xff0c;拖拽&#xff0c;且生成前端项目&#xff08…

基于“遥感+”蓝碳储量估算、红树林信息提取实践技术应用与科研论文写作

目录 “遥感”助推蓝碳生态系统碳储量调查简介 第一章 高光谱遥感数据介绍及预处理 第二章 光谱特征分析与参量提取 第三章 高光谱遥感数据分类与制图 第四章 GEE数据处理介绍 第五章 碳储量时空变化与预测 大气温室气体浓度不断增加&#xff0c;导致气候变暖加剧&#x…

DFS的树上应用

目录 一、前言 二、树上的DFS 1、树的重心 2、树的重心例题 3、树的直径 4、树的直径例题 &#xff08;1&#xff09;做两次DFS 三、拓扑排序与DFS 1、用DFS解拓扑排序 2、欧拉路与DFS 3、用DFS输出一个欧拉回路 一、前言 本文主要讲了树上的DFS、树的重心、树的直…

538. 把二叉搜索树转换为累加树

538. 把二叉搜索树转换为累加树 难度中等 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下&am…

关于浮点数使用的两个注意事项(C/C++)

目录 一.回顾浮点数的存储与读取 二.浮点数使用的第一个注意事项 三.浮点数使用的第二个注意事项 附&#xff1a; 观察内存中的FLT_MAX和FLT_MIN 一.回顾浮点数的存储与读取 http://t.csdn.cn/oVwte 浮点数的存入与读取流程总览&#xff1a; 二.浮点数使用的第一个注意事…

理解实现八大排序

目录 一、初步认识 二、直接插入排序 三、希尔排序 四、直接选择排序 五、堆排序 六、冒泡排序 七、快速排序 7.1 Hoare版本 7.2 挖坑法 7.3 前后指针法 7.4 非递归 7.5 优化方法 7.5.1 三数取中 7.5.2 小区间优化 八、归并排序 九、计数排序 一、初步认识 排…

Netty入门

二. Netty 入门 1. 概述 1.1 Netty 是什么&#xff1f; Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.Netty 是一个异步的、基于事件驱动的网络应用框架&…

简单开发网站+HTML标签

目录 一、学习路线 二、快速开发网站 1、简单demo 2、浏览器能识别的标签 ① 编码② Title ③ 标题 ④ div和span ⑤ 超链接 ⑥ 图片⑦ 列表 ⑧ 表格 ⑨ input系列 ⑩ 下拉框 ⑪ 多行文本 三、网络请求 四、案例 1、用户注册 2、用户登录 五、小结 1、学习标签的总…

网易互客CRM 微盟系统 管易系统 金蝶系统对接集成整体解决方案

前言&#xff1a;大部分的企业都可能只用一套系统组织架构复杂&#xff0c;业务流程繁琐&#xff0c;内部同时有CRM系统、OMS系统、ERP系统......且各个系统都需要独立登陆&#xff0c;造成IT部门数据监管困难&#xff01;如何在同一套中台系统上关联多管理系统呢&#xff1f;系…

【GD32F427开发板试用】-03-定时器1 的不算坑的坑和时钟设置

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;申小林 先说一下我使用定时器1 的时候吧&#xff0c;最开始我以为定时器1是挂在APB1上的&#xff0c;随意按照惯性思维&#xff0c;定时器的时…

vue3使用svg图标多种方式

方式1使用在线链接访问 在iconfont找到自己的项目的图标选择Symbol获取在线链接 2&#xff1a;在vue3项目中找到public的index.html进行script进行引入 打开浏览器看&#xff1a;这样就会自动注入到body下 在项目直接使用 //控制图标的大小<svg style"width: 10px; …

SAP ABAP 函数组组件缺失检查

有没有遇到如下几个场景 场景1 开发1&#xff0c;新建函数组1&#xff0c;创建函数1 开发2&#xff0c;在函数组1里&#xff0c;创建函数2 两者都传Q测试&#xff0c;开发2的先QAT完后发布生产&#xff0c;请求dump&#xff0c;找不到函数2 场景2 函数组1已传生产 开发1&#x…