JavaSE—IO流之字符流与字节流

news2024/9/23 17:18:29

前言:按照数据的传输方向分为输入流和输出流;流也可以从数据编码格式上划分为字节流和字符流;根据封装类型不同流又分为节点流和处理流。           


                                 📌 字节流


📌 字节流中常用类及基本方法:

  • 字节输入流  InputStream
  • 字节输出流  OutputStream

 InputStream的基本方法

  • 读取一个字节并以整数的形式返回(0~255),如果返回-1已到输入流的末尾。
  • int read() throws IOException
  • 读取一系列字节并存储到一个数组buffer, 返回实际读取的字节数,如果读取前已到输入流的末尾返回-1
  • int read(byte[] buffer) throws IOException
  • 关闭流释放内存资源
  • void close() throws IOException

 OutputStream的基本方法

  • 向输出流中写入一个字节数据,该字节数据为参数b的低8位
  • void write(int b) throws IOException
  • 将一个字节类型的数组中的从指定位置(off)开始的 len个字节写入到输出流
  • void write(byte[] b, int off, int len) throws IOException
  • 关闭流释放内存资源
  • void close() throws IOException

📌 代码演示:

public static void main(String[] args) throws IOException {
        FileInputStream inputStream =new FileInputStream("D:/demo1.txt");
        FileOutputStream outputStream=new FileOutputStream("E:/IO.txt");
        byte[] bytes =new byte[10];
        //read(bytes) 一次读byte数组长度个字节,文件内容读取完后返回-1
        //size:每次实际往数组中装入的元素的个数
        int size =0;
        while((size=inputStream.read(bytes))!=-1){
        //一次向外写出一个byte数组长度个字节内容,从指定位置开始写,写size个
            outputStream.write(bytes,0,size);
        }
        //关闭通道
        inputStream.close();
        outputStream.close();
    }

                                 📌 字符流           


 📌 字符流中的常用类及基本方法:

  • 输入字符流 Reader
  • 输出字符流 Writer

○ Reader 的基本方法:

  •  读取一个字符并以整数的形式返回, 如果返回-1已到输入流的末尾。
  • int read() throws IOException
  • 读取一系列字符并存储到一个数组buffer, 返回实际读取的字符数, 如果读取前已到输入流的末尾返回-1。
  • int read( char[] cbuf) throws IOException
  • 关闭  void close() throws IOException

○ Writer 的基本方法:

  • 向输出流中写入一个字符数据,该字节数据为参数b的16位
  • void write(int c) throws IOException
  • 一个字符类型的数组中的数据写入输出流
  • void write( char[] cbuf) throws IOException
  • 将一个字符类型的数组中的从指定位置(off set)开始的 length个字符写入到输出流
  • void write( char[] cbuf, int off set, int length) throws IOException
  • 关闭  void close() throws IOException

字符流只能读取文本文件

📌 代码测试:

我们先创建一个char1.txt文本, 并写入内容进行读写测试

② 通过代码将char1.txt文本的内容读写到char2.txt文本

 public static void main(String[] args) throws IOException {
        FileReader reader =new FileReader("E:/char1.txt");
        FileWriter writer =new FileWriter("E:/char2.txt");
        int b = 0;
        while((b=reader.read())!=-1) {
            System.out.println(b);//打印字符编码
            writer.write(b);
        }
        reader.close();
        writer.close();
    }

 字符流读取时以字符为单位,会将读到字节结合编码表转换为一个字符编码 

 ③ 我们可以将每次读取到的字符对应的编码打印出来

④ 成功读写内容到char2.txt文本


📌 上述写法的弊端:

每次运行程序会将之前所读写的内容覆盖带掉,不能做到在原内容的基础上续写

• 解决方法:在字符输出流的对象路径后加上true, 表示可续写.

• 此时当我们多次运行程序时, 发现之前的所读写的内容依然存在


📌 那么我们怎样进行换行操作?

public static void main(String[] args) throws IOException {
        FileReader reader =new FileReader("E:/char1.txt");
        //保留原来的内容,在原内容基础上向后追加(续写)
        FileWriter writer =new FileWriter("E:/char2.txt",true);
        BufferedReader bufferedReader =new BufferedReader(reader);
        BufferedWriter bufferedWriter =new BufferedWriter(writer);

        String line = null ;
        while((line=bufferedReader.readLine())!=null){//只要每次读取不为空,则读取一行
            bufferedWriter.write(line);//写一行
            bufferedWriter.newLine();//插入换行符
        }
        bufferedReader.close();
        bufferedWriter.flush();
        bufferedWriter.close();//记得在读写完毕后关闭通道

    }

注意: 由于读取一行的方法readLine( )在BufferedReader中,换行方法newLine( )BufferedWriter类中,所有需要用到缓冲字符输入输出流.


○ 此时当我们多次运行程序时, 会将每次读取到的内容进行换行读写, 便于记录数据


                             📌 体系图总结 

📌 总结 :

○ 字节流:读取时以字节为单位,可以读取任意文件

○ 字符流:读取时以字符为单位,只能读取文本文件

字节流中常用类:

  • 字节输入流  FileInputStream
  • 字节输出流  FileOutputStream

字符流中常用类:

  • 字符输入流  FileReader
  • 字符输出流  FileWriter


  • InputStreamOutputStream的子类都是字节流 可以读写二进制文件,主要处理音频、图片、歌曲、字节流处理单元为1个字节。
  • ReaderWriter的子类都是字符流, 主要处理字符或字符串,字符流处理单元为1个字符。

                           📌 节点流与处理流

● 按封装类型,流又分为:

  • 节点流:直接封装的是文件,数据.
  • 处理流:封装的是其他节点流对象;可以提供缓冲功能,提高读写效率.

● 节点流中常用类:

  • 字节输入流 FileInputStream
  • 字节输出流 FileOutputStream
  • 字符输入流 FileReader 
  • 字符输出流 FileWriter

处理流中常用类:

  • 缓冲字节输出流 BufferedOutputStream
  • 缓冲字节输入流 BufferedInputStream
  • 缓冲字符输入流 BufferedReader
  • 缓冲字符输出流 BufferedWriter


 代码演示:

 public static void main(String[] args) throws IOException {
        FileInputStream inputStream = new FileInputStream("D:/demo1.txt");
        //封装的是一个节点流对象,可以提供缓冲功能,称为处理流/包装流
        BufferedInputStream bufferedInputStream =new BufferedInputStream(inputStream,20);
        FileOutputStream outputStream =new FileOutputStream("E:/IO.txt");
        BufferedOutputStream bufferedOutputStream =new BufferedOutputStream(outputStream,20);

        int size =0;
        byte[] bytes =new byte[10];
        while ((size=bufferedInputStream.read(bytes))!=-1){
            bufferedOutputStream.write(bytes,0,size);
        }
        bufferedInputStream.close();
        bufferedOutputStream.close();
    }

 缓存区流底层代码:


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

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

相关文章

水泊梁山108小酒坛之小李广花荣

小李广花荣,是中国著名小说《水浒传》中的108将之一,有“百步穿杨”的功夫。在梁山泊英雄中排行第九,为马军八虎骑兼先锋使之首。原是清风寨副知寨,使一杆银枪,一张弓射遍天下无敌手,生得一双俊目&#xff…

如何使用生成式人工智能进行科学文献检索?

在学术写作过程中,查找文献是一个至关重要的步骤。文献检索不仅可以帮助我们了解研究领域的现状和发展,还可以为我们的论文提供理论支持和数据来源。然而,许多学者在查找文献时往往感到困惑和无所适从。本文将详细解释如何查找文献&#xff0…

java解决跨域问题

浏览器js在访问服务器中的资源时,会出现同一页面或者不同域名(协议,IP,端口)不可访问 例如:file://d://test.html页面(file协议)中通过ajax访问服务器api.test.com的接口(http协议),由于协议不同,此时会出现浏览器访问…

基于数据沙箱与LLM用例自愈的UI自动化测试平台

本期作者 项目参与人员: 顾伊凡、陈钰广、张又中、杨雨浩、樊执政、熊梦园、何璇、谭楠 UI自动化测试能够在一定程度上确保产品质量,尤其在降本提效的大背景下,其重要性愈发凸显。理想情况下,UI自动化测试不仅能够能帮我们规避不少…

低功率接地故障断路器(GFI)控制芯片D4147描述

D4147主要用于三线制GFCI输出接口、GFCI芯片断路器、便携式GFCI线路等领域的产品,侦测并防护火线对地故障和零线对负载短路故障。 功能介绍 D4147 为低功率接地故障断路器(GFI)控制器芯片,用于检测危险的接地故障电流路径以及接地…

基于nodejs+vue文学创作的社交论坛python-flask-django-php

课题主要采用nodejs技术和MySQL数据库技术以及express框架进行开发。系统主要包括个人中心、用户管理、文章类型管理、文章信息管理、文章举报管理、警告信息管理、系统管理等功能,从而实现智能化的社交论坛管理方式,提高社交论坛管理的效率。 前端技术&…

利用Python和IP技术实现智能旅游情报系统

文章目录 引言一、系统架构设计1. 数据采集模块2. 数据处理模块3. 用户界面模块 二、数据获取技术应用三、系统功能展示四、亮数据采集工具介绍五、总结六、号外 引言 随着旅游行业的不断发展,人们对旅游信息的需求也越来越大。为了帮助旅行者更好地规划行程&#…

Springboot:Actuator监控

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、Actuator介绍 二、集成步骤 三、重要端点介绍 1、/actuator 2、/actuator/env 3、/actuator/heapdump 4、/actuator/metrics 5、/actuator/shutdown 6、/l…

通过MobaXterm工具可视化服务器桌面

一、MobaXterm工具 MobaXterm是一款功能强大的远程连接工具,可以连接到各种类型的服务器,包括Linux、Windows和MacOS。支持多种协议,包括SSH、RDP、VNC和Telnet MobaXterm可以通过X11转发功能可视化服务器桌面。 二、MobaXterm工具可视化服务…

CSS中使用伪类:before来实现在标签右上角添加“推荐”等字样的斜三角样式

在HTML中添加标签并赋上类名“.recommend”即可&#xff0c;如下所示&#xff1a; <span class"recommend"></span>css中 .recommend:before {content: "推荐"; position: absolute; top: -8px; right: -26px; z-index: 1; padding: 14px 22…

【嵌入式学习】Qtday03.26

一、思维导图 二、练习 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void Widget::on_login_btn_clicked() {if(ui->…

STM32CubeIDE基础学习-USART串口通信实验(轮询方式)

STM32CubeIDE基础学习-USART串口通信实验&#xff08;轮询方式&#xff09; 文章目录 STM32CubeIDE基础学习-USART串口通信实验&#xff08;轮询方式&#xff09;前言第1章 硬件介绍第2章 工程配置2.1 工程外设配置部分2.2 生成工程代码部分 第3章 代码编写3.1 串口发送3.1.1 发…

KIOXIA铠侠CM7系列E3.S双端口NVMe2.0 PCIe5.0 SSD KCM71RJE7T68

KIOXIA 铠侠推出的CM7-R E3.S企业级NVMe读密集型企业级固态硬盘&#xff0c;采用PCIe 5.0和NVMe 2.0技术&#xff0c;性能出色&#xff0c;最高可达2,700K IOPS&#xff08;随机读取&#xff09;和310K IOPS&#xff08;随机写入&#xff09;1 DWPD的耐用性和高达15.36 TB的存储…

xmes前端问题,给form表单赋值后,再次从表单拿不到该值

xmes前端&#xff0c;给form表单赋值后&#xff0c;再次从表单拿不到该值&#xff0c;但页面可以展示 赋值 this.$[frm-main].$$([namefilm_num]).value filmNum ; 获取表单的值&#xff0c;这里拿不到之前赋的值 const reqData this.$[frm-main].serializeMyForm(); 原因&…

基于tcp协议的网络通信(将服务端守护进程化)

目录 守护进程化 引入 介绍 如何实现 思路 接口 -- setsid 注意点 实现代码 daemon.hpp log.hpp 运行情况 前情提要 -- 前后台任务介绍(区别命令),sessionsid介绍,session退出后的情况(nuhup,终端进程控制组),任务进程组概念,任务与进程组的关系,-bash介绍-CSDN博客…

深入了解服务器硬件:从基础知识到实际应用

在当今数字化的社会中&#xff0c;服务器扮演着至关重要的角色&#xff0c;它们是支撑互联网、云计算、大数据等技术发展的基石。而理解服务器硬件的基础知识对于从事IT领域的人员来说至关重要。本文将从服务器硬件的基础知识出发&#xff0c;介绍服务器硬件的组成、作用及其在…

Rust使用feature特性和条件编译,以及常用feature使用说明

Cargo Feature 是非常强大的机制&#xff0c;可以为大家提供条件编译和可选依赖的高级特性&#xff0c;可以为你省下不少的代码量来判断操作系统和条件编译等功能。rust官方条件编译文档&#xff1a;Conditional compilation - The Rust Reference features特性 Featuure 可以…

基于nodejs+vue电子产品销售系统设计与实现python-flask-django-php

该系统采用了nodejs技术、express框架&#xff0c;连接MySQL数据库&#xff0c;具有较高的信息传输速率与较强的数据处理能力。包含管理员和用户两个层级的用户角色&#xff0c;系统管理员可以对个人中心、用户管理、产品类别管理、电子产品管理、留言板管理、系统管理、订单管…

【开发篇】七、mybatis的foreach遍历,SQL拼接导致内存溢出

文章目录 1、背景2、快照文件分析3、本地环境复现4、结论5、解决方式 1、背景 文章微服务升级&#xff0c;新增了一个传入文章id的List&#xff0c;判断有多少id是存在的接口&#xff0c;第二天高峰期内存溢出。 2、快照文件分析 打开直方图&#xff0c;发现线程对象占用排第…

11.测试教程-自动化测试selenium-3

文章目录 1.unittest框架解析2.批量执行脚本2.1构建测试套件2.2用例的执行顺序2.3忽略用例执行 3.unittest断言4.HTML报告生成5.异常捕捉与错误截图6.数据驱动 大家好&#xff0c;我是晓星航。今天为大家带来的是 自动化测试selenium第三节 相关的讲解&#xff01;&#x1f600…