程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • JavaIO流

    • 初识 Java IO 流
      • 1. 什么是 IO 流
      • 2. 为什么需要学习 IO 流
      • 3. Java IO 流的基本分类
        • 3.1 按照数据流向分类
        • 3.2 按照数据处理类型分类
        • 3.3 节点流和处理流
      • 4. 输入流与输出流的区分
      • 5. 字节流与字符流的区别
        • 字节流与字符流的其他区别
      • 6. 节点流与处理流的区别
        • 节点流与处理流的示意图
      • 7. 重要的处理流——缓冲流
    • 文件操作
    • 字节流
    • 字符流
    • 缓冲流
    • 节点流和处理流的区别
    • IO流 其他内容
  • IO流
  • JavaIO流
scholar
2024-08-22
目录

初识 Java IO 流

# 初识 Java IO 流

在 Java 中,IO 流是非常重要的一部分,涉及到对数据的读取与写入操作。IO 流是 Java 程序中进行文件操作、网络通信、数据传输等场景的核心技术。


# 1. 什么是 IO 流

IO 流中的 I/O 是输入(Input)和输出(Output)的缩写。它通常指数据在存储器(内存、硬盘等)或其他设备之间的输入和输出。Java 中的 IO 流可以看作是一个数据流动的通道,通过这个通道,我们可以将数据从一个地方传输到另一个地方。

流(Stream) 是一种抽象的概念,它可以理解为一个有序的、先进先出(FIFO)的数据传输通道。程序可以通过流从数据源中读取数据(输入流),也可以通过流将数据输出到目标位置(输出流)。

# 2. 为什么需要学习 IO 流

  • 数据持久化存储:使用变量、数组或集合存储数据只能存在于内存中,一旦程序结束,数据就会丢失。通过 IO 流,我们可以将数据存储到文件中,实现数据的持久化。
  • 数据读取和处理:通过 IO 流,我们可以读取文件、从网络接收数据,并将这些数据处理后存储到文件、数据库等介质中。

# 3. Java IO 流的基本分类

Java 中的 IO 流可以按照不同的标准进行分类,以下是常见的分类方式:

# 3.1 按照数据流向分类

  • 输入流 (Input Stream):用于读取数据,数据从外部输入到内存中。常见的输入流包括 FileInputStream、BufferedReader 等。
  • 输出流 (Output Stream):用于写入数据,数据从内存输出到外部设备。常见的输出流包括 FileOutputStream、BufferedWriter 等。

# 3.2 按照数据处理类型分类

  • 字节流 (Byte Stream):用于处理二进制数据,如图片、音频、视频等,数据单位为字节 (byte)。
    • 常用字节输入流:InputStream 的子类,如 FileInputStream。
    • 常用字节输出流:OutputStream 的子类,如 FileOutputStream。
  • 字符流 (Character Stream):用于处理文本数据,数据单位为字符 (char),能够自动处理字符编码。
    • 常用字符输入流:Reader 的子类,如 FileReader。
    • 常用字符输出流:Writer 的子类,如 FileWriter。

# 3.3 节点流和处理流

  • 节点流:直接操作数据源或目标的流,如文件流、内存流等。例如,FileInputStream 直接从文件中读取数据。
  • 处理流:对已有流进行封装,提供更多功能或优化性能,例如缓冲流。处理流通常需要依赖节点流。例如,BufferedInputStream 是一个缓冲字节输入流,用于提高读写效率。

# 4. 输入流与输出流的区分

输入和输出是相对于程序而言的:

  • 读取文件的操作使用输入流:FileInputStream、BufferedReader 等。
  • 写入文件的操作使用输出流:FileOutputStream、BufferedWriter 等。

示例图解

输入流与输出流


# 5. 字节流与字符流的区别

字节流和字符流的使用方法非常相似,主要区别在于处理的数据单位不同:

  • 字节流 (Byte Stream):处理的是二进制数据,数据单位是 8 位的字节 (byte)。常用于处理非文本数据,如图片、视频等。
  • 字符流 (Character Stream):处理的是文本数据,数据单位是 16 位的字符 (char)。常用于处理文本文件。

为什么需要字符流?

字符流是为了解决字节流处理文本时可能出现的编码问题。字符流能够根据指定的编码方式(如 UTF-8、GBK)正确地处理字符,而不至于出现乱码问题。

  • Java 中的字符编码使用 Unicode 标准,一个字符(如汉字)通常占用 2 或更多字节。如果使用字节流处理时拆分字符对应的字节序列,就可能导致读取不完整,出现乱码问题。字符流就是为了解决这一问题而设计的。

# 字节流与字符流的其他区别

  • 适用场景:字节流可以处理任意类型的文件,字符流适用于处理纯文本文件。
  • 缓冲机制:字节流通常没有自带的缓冲区,字符流则自带缓冲机制。

# 6. 节点流与处理流的区别

  • 节点流:直接操作数据源(如文件、网络等)的流。节点流是底层的数据传输接口,例如 FileInputStream、FileReader。
  • 处理流:对节点流进行封装,提供额外功能,例如缓冲、数据过滤等。处理流不直接连接数据源,而是基于节点流进行进一步处理。常见的处理流有 BufferedInputStream、BufferedReader。

# 节点流与处理流的示意图

节点流与处理流


# 7. 重要的处理流——缓冲流

缓冲流是处理流的一种,用于提高数据传输效率。它通过在内存中设置缓冲区,减少程序与磁盘之间的交互次数,从而提升性能。常见的缓冲流有 BufferedInputStream、BufferedReader 等。

缓冲流示意图:

缓冲流


总结

Java 的 IO 流通过抽象流的概念,将数据的读取与写入过程简化为流动操作。通过灵活地使用字节流、字符流、节点流和处理流,可以高效地进行各种数据的输入输出操作。理解 IO 流的分类与特点,是进行文件操作、网络通信等开发的重要基础。

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
文件操作

文件操作→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式