IO流:字节流 字符流 缓冲流详解

news2024/12/23 17:04:51

IO流:字节流 字符流 缓冲流详解 📚

  • 【Java】IO流:字节流 字符流 缓冲流详解 📚
    • 摘要
    • 引言
    • 一、“流”的概念
      • 1. “流”的分类
        • 1.1 输入流和输出流
        • 1.2 字节流和字符流
          • 字节和字符的区别?
          • 为什么要有字符流?
        • 1.3 节点流和处理流
          • 字符流自带缓冲区,为什么还要用字符缓冲流?
      • 2. “流”的特性
    • 二、字节流(Stream流)
      • 1. InputStream流
        • 1.1 版本一:无参`read()`
        • 1.2 版本二:`read(byte[] b)`
        • 1.3 版本三:`read(byte[] b, int offset, int len)`
      • 2. OutputStream流
        • 示例代码
    • 三、字符流(Reader和Writer)
      • 1. Reader
        • 示例代码
      • 2. Writer
        • 示例代码
    • 四、缓冲流(BufferedStream)
      • 1. BufferedReader
        • 示例代码
      • 2. BufferedWriter
        • 示例代码
      • 3. BufferedInputStream和BufferedOutputStream
        • 示例代码
    • 🤔 QA环节
    • 小结📋
    • 未来展望🔮
    • 参考资料📚

在这里插入图片描述

博主 默语带您 Go to New World.
个人主页—— 默语 的博客👦🏻
《java 面试题大全》
《java 专栏》
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨


【Java】IO流:字节流 字符流 缓冲流详解 📚

摘要

大家好,我是默语。今天我们来聊一聊Java中的IO流,包括字节流、字符流和缓冲流。本文将详细介绍这些流的概念、分类、使用方法,并通过具体的代码示例演示如何在项目中灵活应用这些流。让我们一起深入探索吧!✨

引言

IO流是Java编程中的一个重要组成部分,用于处理数据的输入和输出操作。通过IO流,我们可以读取和写入文件、网络通信和其他数据源。本文将详细介绍Java IO流的分类、特性及其具体使用方法,帮助你在实际项目中更好地理解和应用这些知识。

一、“流”的概念

1. “流”的分类

1.1 输入流和输出流

IO流根据数据流动的方向,可以分为输入流和输出流:

  • 输入流:用于读取数据,从外部资源(如文件、网络等)读取数据到程序中。
  • 输出流:用于写入数据,将数据从程序写入到外部资源。
1.2 字节流和字符流

根据处理的数据类型,可以分为字节流和字符流:

  • 字节流:以字节为单位处理数据。适用于处理二进制数据,如图像、音频、视频等。
  • 字符流:以字符为单位处理数据。适用于处理文本数据,能够正确处理不同编码格式的文本。
字节和字符的区别?

字节是计算机存储数据的基本单位,一个字节由8位二进制数构成。字符是文本数据的基本单位,一个字符通常由一个或多个字节表示,具体取决于字符编码(如UTF-8、UTF-16等)。

为什么要有字符流?

字符流能够更好地处理文本数据,因为它可以自动处理不同的字符编码问题。字节流只能逐字节处理数据,不考虑编码,因此在处理文本数据时可能会出现乱码问题。

1.3 节点流和处理流
  • 节点流:直接与数据源或目的地相连,如文件、内存等。它是IO操作的底层实现。
  • 处理流:在节点流之上进行包装,通过对已有流的包装和组合,提供更高效或更方便的操作。
字符流自带缓冲区,为什么还要用字符缓冲流?

虽然字符流自带缓冲区,但字符缓冲流(如BufferedReaderBufferedWriter)提供了更大的缓冲区和更高效的读写操作。它们还提供了一些方便的方法,如按行读取(readLine)和按行写入(newLine)。

2. “流”的特性

  • 单向性:每个流只能在一个方向上操作,要么是输入,要么是输出。
  • 顺序性:数据在流中按照顺序传递,不允许随机访问。
  • 缓冲性:流的操作通常涉及缓冲区,以提高读写性能。

二、字节流(Stream流)

1. InputStream流

InputStream是所有字节输入流的抽象基类,主要用于读取字节数据。

1.1 版本一:无参read()

该方法一次读取一个字节,返回值为读取的字节数据(0-255范围内的整数),若到达流的末尾则返回-1。

import java.io.FileInputStream;
import java.io.IOException;

public class InputStreamExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("example.txt")) {
            int data;
            while ((data = fis.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
1.2 版本二:read(byte[] b)

该方法一次读取多个字节,存储到字节数组b中,返回读取的字节数,若到达流的末尾则返回-1。

import java.io.FileInputStream;
import java.io.IOException;

public class InputStreamExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("example.txt")) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                System.out.print(new String(buffer, 0, bytesRead));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
1.3 版本三:read(byte[] b, int offset, int len)

该方法一次读取多个字节,存储到字节数组b中,从偏移量offset开始,最多读取len个字节,返回读取的字节数,若到达流的末尾则返回-1。

import java.io.FileInputStream;
import java.io.IOException;

public class InputStreamExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("example.txt")) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = fis.read(buffer, 0, buffer.length)) != -1) {
                System.out.print(new String(buffer, 0, bytesRead));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. OutputStream流

OutputStream是所有字节输出流的抽象基类,主要用于写入字节数据。

示例代码
import java.io.FileOutputStream;
import java.io.IOException;

public class OutputStreamExample {
    public static void main(String[] args) {
        try (FileOutputStream fos = new FileOutputStream("example.txt")) {
            String data = "Hello, World!";
            fos.write(data.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

三、字符流(Reader和Writer)

1. Reader

Reader是所有字符输入流的抽象基类,主要用于读取字符数据。

示例代码
import java.io.FileReader;
import java.io.IOException;

public class ReaderExample {
    public static void main(String[] args) {
        try (FileReader fr = new FileReader("example.txt")) {
            int data;
            while ((data = fr.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. Writer

Writer是所有字符输出流的抽象基类,主要用于写入字符数据。

示例代码
import java.io.FileWriter;
import java.io.IOException;

public class WriterExample {
    public static void main(String[] args) {
        try (FileWriter fw = new FileWriter("example.txt")) {
            String data = "Hello, World!";
            fw.write(data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

四、缓冲流(BufferedStream)

1. BufferedReader

BufferedReader是字符输入缓冲流,提供了更高效的读操作和一些便利的方法,如readLine()

示例代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. BufferedWriter

BufferedWriter是字符输出缓冲流,提供了更高效的写操作和一些便利的方法,如newLine()

示例代码
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterExample {
    public static void main(String[] args) {
        try (BufferedWriter bw = new BufferedWriter(new FileWriter("example.txt"))) {
            bw.write("Hello, World!");
            bw.newLine();
            bw.write("This is a new line.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. BufferedInputStream和BufferedOutputStream

BufferedInputStreamBufferedOutputStream是字节输入和输出缓冲流,提供了更高效的字节读写操作。

示例代码
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedStreamExample {
    public static void main(String[] args) {
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt"));
             BufferedOutputStream bos = new BufferedOutputStream

(new FileOutputStream("output.txt"))) {

            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

🤔 QA环节

Q: 为什么使用缓冲流?

A: 缓冲流通过引入缓冲区,减少了IO操作的次数,从而提高了读写效率。尤其是对于频繁的小数据读写操作,缓冲流能够显著提升性能。

Q: 如何选择字节流和字符流?

A: 如果处理的是二进制数据,如图像、音频、视频等,使用字节流。如果处理的是文本数据,使用字符流。字符流能够正确处理不同编码格式的文本数据,避免乱码问题。

小结📋

本文详细介绍了Java中的IO流,包括字节流、字符流和缓冲流。通过理解这些流的概念、分类和使用方法,以及代码示例,你应该能够在实际项目中灵活应用这些知识,提高数据读写操作的效率。

未来展望🔮

随着Java的发展,IO操作将变得更加简便和高效。持续关注Java的更新和新特性,将有助于我们在实际项目中更好地应用这些技术。

参考资料📚

  1. Java官方文档 - InputStream类
  2. Java官方文档 - OutputStream类
  3. Java官方文档 - Reader类
  4. Java官方文档 - Writer类
  5. Java官方文档 - Scanner类

在这里插入图片描述


🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

在这里插入图片描述

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

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

相关文章

爬虫实战教程:深入解析配乐网站爬取1000首MP3

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、实战前准备 1. 选择目标网站 2. 分析网页结构 三、爬虫工作流程详解 1. 发…

Web上机:JSP+Servlet+JDBC的交互流程

目录 需求与设计 基础需求: 项目结构: 项目逻辑: 运行图示: 代码实现 Login.jsp InsertServlet SelectServlet Table.jsp user mysql表结构 Web开发技术迭代速度日新月异,对于技术的更新往往是基于底层一…

Node.js笔记(万字总结)

目录 前言 1.node介绍与使用 1.1 Node介绍 1.2 node.js的优势 1.3 node的安装 1.4 检验是否成功安装 1.5 第一个应用 1.5.1 服务器代码 server.js 1.5.2 完整代码 1.5.3 运行 1.5.4 测试 2.获取参数 3.模块系统 1.模块介绍 2.xiaoyu.js 3.xiaoyu.js完整代码 4…

Midjourney 推出Style Tuner工具 ,统一风格,提升创作效率!

Midjourney 由前 Magic Leap 程序员大卫 - 霍尔茨(David Holz)构思,于 2022 年夏天推出,在独立消息应用 Discord 的服务器上吸引了超过 1600 万用户,并由一个小规模的程序员团队不断更新,推出了包括平移、扩…

重温!瑞幸崩盘时的狂欢,我的股票盈利170%,陆正耀资本局大起底

瑞幸咖啡 瑞幸2019年5月,仅用了18个月就完成了上市。 不到1年,2020年3月戏剧化反转,被爆造假 2019年净收入虚增21亿,2季度2.5亿,3季度7亿、4季度11.7亿。 2019年成本支出虚增13亿,2季度1.5亿元&#xf…

UE4/UE5像素流送云推流:多人访问不稳定、画面糊、端口占用多等

UE4/UE5想要实现网页访问,很多工程师会选择guan方的像素流送。但这个技术要求在模型开发初期就接入。对于一些已有UE模型是无法进行流化的。虽然也可以解决新UE模型的网页访问问题,但在实际的应用中,点量云流也收到很多反馈说,使用…

重生之 SpringBoot3 入门保姆级学习(02、打包部署)

重生之 SpringBoot3 入门保姆级学习(02、打包部署) 1.6 打包插件1.7 测试 jar 包1.8 application.properties 的相关配置 1.6 打包插件 官网链接 https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-starte…

短视频矩阵系统4年独立开发正规代发布接口源码搭建部署开发

1. 短视频矩阵源码技术开发要求及实现流程: 短视频矩阵源码开发要求具备视频录制、编辑、剪辑、分享等基本功能,支持实时滤镜、特效、音乐等个性化编辑,能够实现高效的视频渲染和处理。开发流程主要包括需求分析、技术选型、设计架构、编码实…

专家解读 | NIST网络安全框架(2):核心功能

NIST CSF是一个关键的网络安全指南,不仅适用于组织内部,还可帮助管理第三方网络安全风险。CSF核心包含了六个关键功能——治理、识别、保护、检测、响应和恢复,以及与这些功能相关的类别和子类别。本文将深入探讨CSF核心的主要内容&#xff0…

大气走航VOCS监测

1. 什么是走航监测? 走航监测主要指驾驶移动监测车,在一定区域范围之内边行驶、边检测、边反馈。通过车载的质谱监测系统,对环境空气中的VOCs进行快速检测;通过检测出的污染物总浓度,描绘污染地图。环保部门从污染地…

wincc如何实现远程监控1200PLC

用户监控中心和PLC不在同一个地方,需要通过互联网远程能监控PLC的运行状况。PLC型号是西门子1200,远程监控电脑用WINCC组态。wincc如何实现远程监控1200PLC呢。WINCC的通讯协议都是局域网,不能通过互联网找到远端PLC并通讯。随着工业物联网发…

PyTorch中的模型创建

最全最详细的PyTorch神经网络创建~ 话不多说直接开始~ 神经网络的创建步骤 定义模型类,需要继承nn.Module定义各种层,包括卷积层、池化层、全连接层、激活函数等等编写前向传播,规定信号是如何传输的 可以用 torchsummary 查看网络结构&…

拼多多的一场机试 解题报告 | 珂学家

前言 拼多多的一场机试 解题报告 有需要机试辅导,可以私信我 机试题 D. 任务队列是否会死锁? 一个任务队列,长度为n 可以添加一个任务,长度为a可以获取一个任务,长度为b 如果存在一个状态点,即不能添加…

python 两个表格字段列名称值,对比字段差异

支持xlsx,xls文件,相互对比字段列 输出两个表格文件相同字段,置底色为绿色 存在差异的不同字段,输出两个新的表格文件,差异字段,置底色为红色 import pandas as pd from openpyxl import load_workbook from openpy…

简单易懂的 API 集成测试方法

简介:API 集成测试的重要性 API 集成测试是一类测试活动,用于验证 API 是否满足功能性、可靠性、性能和安全性等方面的预期要求。在多 API 协作的应用程序中,这种测试尤为紧要。 在这一阶段,我们不仅审视单个组件,还…

比例溢流阀的放大器找BEUEC

液压比例放大器的使用范围广泛,包括工业生产线、船舶液压系统等多个领域。BEUEC比例放大器是一种重要的液压系统组件,其作用是将微弱的液压信号放大,以实现对液压系统的精确控制。这种设备在多个行业中都有广泛的应用,特别是在需要…

可视化大屏开发,知道了这些经验以及解决方案,效率至少提升2倍!(完结篇)

大家好,我是日拱一卒的攻城师不浪,专注可视化、数字孪生、前端、nodejs、AI学习、GIS等学习沉淀,这是2024年输出的第16/100篇文章; 前言 之前写了两篇可视化大屏开发的经验总结,小伙伴们反应还不错。 最近&#xff0…

响应式UI组件DevExtreme中文教程 - 工具栏的自适应模式

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac&#xff0c…

浅谈JMeter环境变量设置

JMeter环境变量设置 确保已安装Java Development Kit (JDK) JMeter需要Java运行环境,因此请先安装JDK,并确认JAVA_HOME环境变量已经设置好。可以通过命令提示符输入java -version和javac -version来验证是否安装成功及其版本信息,若没有出现…

阿里云 EMR Serverless Spark 版开启免费公测

阿里云 EMR Serverless Spark 版是一款云原生,专为大规模数据处理和分析而设计的全托管 Serverless 产品。它为企业提供了一站式的数据平台服务,包括任务开发、调试、调度和运维等,极大地简化了数据处理的全生命周期工作流程。使用 EMR Serve…