【Java】IO流 - 节点流和处理流【Buffered】

news2025/1/10 3:32:09

文章目录

  • 节点流和处理流
  • BufferedReader
  • BufferedWriter
  • Bufferd拷贝
  • BufferedInputStream/BufferedOutputStream

节点流和处理流

在这里插入图片描述

  • 数据源就是存放数据的地方,可以是 文件、数组 等等;

    • 节点流是比较底层的,直接操作二进制数据
  • 包装流(处理流)是将节点流给包装了起来,更加灵活(相当于任意节点流,任意数据源都可)
    在这里插入图片描述
    BufferedReader里的Reader方法相当于把FileInputStream、FileReader等等给包装了起来,涵盖这些方法,可以是任意一个节点流(只要是Reader的子类就可以)

       同理 BufferedWriter也一样 (装饰器模式)
    

节点流和处理流一览:在这里插入图片描述

在这里插入图片描述
Reader是抽象父类,而FileInputStream、FileReader等等是实现方法的子类(节点流);BufferedReader是继承Reader的属性,然后把节点流给封装扩展起来,使用更便捷,不用区分文件、数组、字符等等。

  • BufferedReader和BufferedWriter属于字符流,都是按字符来读取数据的;
  • 真正工作的其实还是节点流而不是处理流,处理流只是做了一个封装;
  • 关闭处理流时,只需关闭最外层流(处理流)即可;

BufferedReader

  • 使用BufferReader读取文本文件,并显示在控制台;

使用 readLine() 按行读取:

public static void main(String[] args) throws Exception {
    String filePath = "d:\\HelloWorld.txt" ;//自行创建编辑
    //创建BufferedReader对象
    BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
    //读取
    String line;//按行读取,效率高
    /*
    说明:
        1.bufferedReader.readLine() 按行读取
        2.返回null时,表示文件读取完毕
     */
    while((line = bufferedReader.readLine()) != null){
        System.out.println(line);
    }
    //关闭流,只需关闭BufferedReader,因为底层的节点流会自动关闭
    bufferedReader.close();
}

BufferedWriter

public static void main(String[] args) throws IOException {
    String filePath = "d:\\note.txt";//创建空白文件
    //创建BufferedWriter对象
    BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath));//覆盖写入
    bufferedWriter.write("Hello!");               //需要追加就FileWriter(filePath,true)
    //插入一个和系统相关的换行
    bufferedWriter.newLine();
    bufferedWriter.write("Java!");
    bufferedWriter.newLine();
    bufferedWriter.write("祝你开心每一天~");
    //关闭外层流即可
    bufferedWriter.close();
}

Bufferd拷贝

public static void main(String[] args) throws Exception {
    /*
    说明:
        1.BufferedReader和BufferedWriter是安装字符操作
        2.不要去操作二进制文件,可能会造成损坏(例如音视频、doc、pdf)
     */
    String srcFilePath = "d:\\HelloWorld.txt";//提前创建
    String destFilePath = "d:\\hello.txt";//目标文件
    BufferedReader bufferedReader =null;
    BufferedWriter bufferedWriter =null;
    bufferedReader = new BufferedReader(new FileReader(srcFilePath));
    bufferedWriter = new BufferedWriter(new FileWriter(destFilePath));
    String line;
    while((line=bufferedReader.readLine())!=null) {
        bufferedWriter.write(line);
        bufferedWriter.newLine();
    }
    System.out.println("拷贝完毕");
    //关闭资源
    if(bufferedReader!=null) bufferedWriter.close();
    if(bufferedWriter!=null) bufferedWriter.close(); 
}

既然 BufferedReader/BufferedWriter 不能操作二进制文件,
那对于二进制文件,该采用什么方法呢?

BufferedInputStream/BufferedOutputStream

  • BufferedInputStream 是字节流 ,实现缓冲的输出流,可以将多个字节写入底层输出流中,而不必对每次字节写入调用底层系统。

音乐、视频的拷贝:

/*
演示使用BufferedInputStream和BufferedOutputStream拷贝
 */
public static void main(String[] args) throws Exception{
    String srcFilePath = "d:\\蜘蛛侠.jpg";
    String destFilePath = "d:\\spiderman.jpg";
    //创建BufferedInputStream和BufferedOutputStream对象
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFilePath));
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
    //循环读取文件,并写入到destFilePath中
    byte[] buff = new byte[1024];
    int readLen = 0;
    //当返回-1时,表示文件读取完毕
    while((readLen = bis.read(buff))!=-1){
        bos.write(buff,0,readLen);
    }
    //关闭外层的处理流即可
    bis.close();
    bos.close();

字节流不仅仅可以操作二进制文件,还可以操作文本文件

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

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

相关文章

石英砂过滤器 多介质过滤器 活性炭过滤器

石英砂过滤器简介 石英砂过滤器属于机械过滤器的一种为压力式过滤器,采用ABS蘑菇型水帽布水,内装若干种规格精制石英砂滤料,阻力小,通量大。利用过滤器内所装的填料来截留去除水中悬浮微粒和胶体杂质。当过滤器因滤层污脏&#x…

解决git配置多个SSH公钥的问题

项目场景: 之前跟同事共用一个项目私密仓库,现需拆分成两个仓库,结果同事提出他不想换,让我这边再创建一个新仓库。 那么接下来就遇到一个情况,原来仓库的公钥我并不想删除,还想继续使用&#xff0c…

Ubuntu20.04沉浸式装机

Ubuntu20.04沉浸式装机 文章目录Ubuntu20.04沉浸式装机前言1.装机之后系统更新,设置软件源2.安装系统驱动Notice3 安装CUDA及CuDNN4 常用软件安装4.1 常用软件安装4.2 Typora安装4.3 docker安装4.4 nvidia-docker 安装4.5 pypcd 安装4.6 PCL安装环境安装4.7 Eigen安…

Python学习基础笔记七——元组

元组tuple,跟列表相似,元组不能在原处修改。元组不支持任何方法调用,但是元组具有列表的大多数属性。 但是要记住的是:元组的不可变性只适用于元组本身,并非其内容。例如元组内部的列表是可以像往常一样修改的。 元组常…

Go1.20 arena新特性示例详解

当时我们还想着 Go 团队应该不会接纳,至少不会那么快: 懒得翻也可以看我再次道来,本文提到的提案《proposal: arena: new package providing memory arenas》,这其中的 Arena 将会是一个突破项。 快速背景 Arena 指的是一种从一个…

Java接口的应用

目标:总结Comparable接口以及compareTo方法、comparator接口中compare方法比较器、toString方法、equals方法、hashCode方法、Cloneable接口以及深浅拷贝 比较对象中内容的大小【Comparable接口以及compareTo方法】 例如:学生类:成员有姓名、…

计算机网络4小时速成:数据链路层,功能,封装成帧,透明传输,差错控制,PPP协议,广播信道,以太网,MAC层,设备

计算机网络4小时速成:数据链路层,功能,封装成帧,透明传输,差错控制,PPP协议,广播信道,以太网,MAC层,设备 2022找工作是学历、能力和运气的超强结合体&#x…

Linux C/C++ 学习笔记(四):MYSQL安装与远程连接

问题及解决 对配置文件中绑定的IP地址进行修改 通过Mysql workbench连接MySQL数据库时出现错误 需要对mysq的配置文件进行修改,配置文件是/etc/mysql下的my.cnf 绑定的地址是一个回环地址,不能对外使用 将其修改为0.0.0.0。 0.0.0.0不是一个真正意义…

MySQL主从数据库(主读从写)

MySQL多数据源MySQL主从数据库(主读从写)1. 多数据源的实现原理1.1 配置多数据源yml文件1.2 创建配置类1.3 动态切换数据源类继承AbstractRoutingDataSource 类1.4 测试类测试1.5 附枚举代码1.6 总结2. 多数据源切换方式(优化)2.1…

HTML做一个简单漂亮的宠物网页(纯html代码) 带视频 带音乐 带报告

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 宠物网页设计 | 保护动物网页 | 鲸鱼海豚主题 | 保护大象 | 等网站的设计与制作 | HTML宠物网页设计 | HTML期末大学生网页设计作业 HTML:…

酒水推荐商城|基于Springboot实现酒水商城系统

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

FLP、CAP和BASE

FLP不可能原理 FLP定理 FLP Impossibility(FLP 不可能性)是分布式领域中一个非常著名的定理,定理的论文是由 Fischer, Lynch and Patterson 三位作者于1985年发表 It is impossible to have a deterministic protocol that solves consens…

通过WebSocket实现实时系统通知,以后再也不能装作没看到老板的通知了~~

📞 文章简介:WebSocket实时通知Demo 💡 创作目的:因为公司正在从零搭建CRM,其中有一个需求是系统通知管理,老板发布通知给员工。简单的用数据库实现感觉缺少一些实时性,不是那么生动。于是想到了…

向毕业妥协系列之深度学习笔记(三)DL的实用层面(上)

目录 一.训练_开发_测试集 二.方差与偏差 三.正则化 四.Dropout正则化 五.其他正则化方法 本篇文章大部分又是在ML中学过的,除了Dropout正则化及之后的部分。 一.训练_开发_测试集 在配置训练、验证和测试数据集的过程中做出正确决策会在很大程度上帮助大家创…

[Spring MVC 8]高并发实战小Demo

本项目基于Spring MVC进行关于点赞项目的开发,从传统的点赞到高并发缓存开发最后到消息队列异步开发,可谓是令人大开眼界。 本篇博客全部代码已经放出,本博客重点是后端操作,所以对于前端就十分简单的页面。讲述了关于Redis,Quart…

软件安装教程1——Neo4j下载与安装

Neo4j的下载地址Neo4j Download Center - Neo4j Graph Data Platform 我下载的是Neo4j社区版(免费)【企业版收费】 解压后的目录如下: 接下来配置环境变量 进入bin目录,复制路径:E:\neo4j\neo4j-community-5.1.0-win…

决策树——预剪枝和后剪枝

一、 为什么要剪枝 1、未剪枝存在的问题 决策树生成算法递归地产生决策树,直到不能继续下去为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即容易出现过拟合现象。解决这个问题的办法是考虑决策树…

【Lua基础 第2章】lua遍历table的方式、运算符、math库、字符串操作方法

文章目录💨更多相关知识👇一、lua遍历table的几种方式🍂pairs遍历🍂ipairs遍历🍂i1,#xxx遍历🌟代码演示🍂pairs 和 ipairs区别二、如何打印出脚本自身的名称三、Lua运算符🔸算术运算…

微服务治理-含服务线上稳定性保障建设治理

微服务的概念 任何组织在设计一套系统(广义概念上的系统)时,所交付的设计方案在结构上都与该组织的沟通结构保持一致。 —— 康威定律 微服务是一种研发模式。换句话理解上面这句康威定律,就是说 一旦企业决定采用微服务架构&am…

Js逆向教程-12FuckJs

Js逆向教程-12FuckJs 它利用了js的语法特性: 一、特性1 任何一个js类型的变量结果 加上一个字符串 ,只会变成字符串。 数组加上字符串: [0]"" 0true加上字符串 true "" true数字加上字符串 1"" 1二、特性…