浅谈Java IO流

Java中的IO流(Input/Output streams)是Java程序用来处理数据输入和输出的核心工具集。IO流抽象了数据流动的概念,允许Java程序与外部世界进行数据交换,无论是从文件、网络、键盘输入还是向屏幕、文件或网络发送数据。Java IO流按照处理数据的不同类型和方向,可以分为以下几个关键类别:

  1. 字节流(Byte Streams)
    • java.io.InputStreamjava.io.OutputStream 是所有字节流的顶层抽象接口,分别表示字节输入流和字节输出流。这类流主要用于处理原始的二进制数据,如图片、音频、视频等非文本文件。
    • 具体的实现类包括 FileInputStreamFileOutputStream 用于读写文件,ByteArrayInputStreamByteArrayOutputStream 用于内存中的字节数组操作,还有 BufferedInputStreamBufferedOutputStream 等缓冲流,提供了数据读写的缓冲功能,提升效率。
  2. 字符流(Character Streams)
    • java.io.Readerjava.io.Writer 是字符流的顶级接口,用于处理字符数据,即文本数据。
    • 具体实现类如 FileReaderFileWriter 用于读写文本文件,BufferedReaderBufferedWriter 则提供了缓存功能,还有 CharArrayReaderCharArrayWriter 用于内存中的字符数组操作。
  3. 节点流与处理流
    • 节点流 直接与数据源或目的地相连,例如读取硬盘文件或写入网络套接字的数据流。
    • 处理流包装流 并不直接连接到数据源或目的地,而是在已有节点流的基础上添加额外功能,如过滤、格式转换、缓冲等。例如 DataInputStreamDataOutputStream 用于数据的序列化和反序列化,PrintStream 提供了格式化的输出能力,GZIPOutputStreamGZIPInputStream 则实现了数据的压缩和解压。
  4. 高级IO流(NIO)
    • 自Java 1.4以来引入了New IO(NIO),提供了新的通道(Channel)和缓冲区(Buffer)API,允许非阻塞的、面向缓冲的IO操作。例如 java.nio.channels.FileChannel 可以用于高性能的文件读写操作。

Java提供了大量的类来支持IO操作,下表给大家介绍了其中比较常用的一些类。其中,黑色字体的是抽象基类,其他所有的类都继承自它们。红色字体的是节点流,蓝色字体的是处理流。
在这里插入图片描述
根据命名很容易理解各个流的作用:

  • 以File开头的文件流用于访问文件;

  • 以ByteArray/CharArray开头的流用于访问内存中的数组;

  • 以Piped开头的管道流用于访问管道,实现进程之间的通信;

  • 以String开头的流用于访问内存中的字符串;

  • 以Buffered开头的缓冲流,用于在读写数据时对数据进行缓存,以减少IO次数;

  • InputStreamReader、InputStreamWriter是转换流,用于将字节流转换为字符流;

  • 以Object开头的流是对象流,用于实现对象的序列化;

  • 以Print开头的流是打印流,用于简化打印操作;

  • 以Pushback开头的流是推回输入流,用于将已读入的数据推回到缓冲区,从而实现再次读取;

  • 以Data开头的流是特殊流,用于读写Java基本类型的数据。

注意:
Java IO流的设计遵循了装饰器模式,允许我们通过组合不同类型的流来实现复杂的数据处理任务。在使用流的时候,需要关注资源的有效管理和异常处理,通常会使用try-with-resources语句来确保流在使用完毕后会被正确关闭。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

切换plesk面板语言

近期购入了Hostease的Windows虚拟主机产品,由于进入他们主机Plesk面板后查看全都是英文的,对于英文也不是很懂,尤其是像这种专业 词汇的更不明白。因此这边咨询了Hostease的技术支持,寻求帮助了解到可以Plesk面板可以切换语言的&a…

SAP HANA锁表查询,解锁操作

锁表查看 --锁表检查语句 SELECT C.CONNECTION_ID,PS.STATEMENT_STRINGFROM M_CONNECTIONS C JOIN M_PREPARED_STATEMENTS PSON C.CONNECTION_ID PS.CONNECTION_ID AND C.CURRENT_STATEMENT_ID PS.STATEMENT_IDWHERE C.CONNECTION_STATUS RUNNINGAND C.CONNECTION_TYPE Re…

Canvas使用详细教学:从基础绘图到进阶动画再到实战(海报生成、Flappy Bird 小游戏等),掌握绘图与动画的秘诀

一、Canvas基础 1. Canvas简介 Canvas是HTML5引入的一种基于矢量图形的绘图技术,它是一个嵌入HTML文档中的矩形区域,允许开发者使用JavaScript直接操作其内容进行图形绘制。Canvas元素不包含任何内在的绘图能力,而是提供了一个空白的画布&a…

【开发规范】Mapstruct 转换器使用教程

【开发规范】Mapstruct 转换器使用教程 一、对象转化二、推荐使用 MapStruct三、MapStruct 介绍3.1 概念3.2 特点3.3 使用场景3.4 使用教程3.4.1 导入依赖3.4.2 编写 Entity 和 DetailInfo3.4.3 编写转换器(※)3.4.4 使用转换器3.4.5 结果3.4.6 扩展&…

MySQL死锁与死锁检测

一、什么是MySQL死锁 MySQL中死锁是指两个或多个事务在互相等待对方释放资源,导致无法继续执行的情况。 MySQL系统中当两个或多个事务在并发执行时,就可能会遇到每项事务都持有某些资源同时又请求其他事务持有的资源,从而形成事务之间循环等…

java学习之路-多态

文章目录 目录 文章目录 前言 1.多态 1.1 多态的概念 1.2 多态实现条件(重点) 多态实现的栗子 1.3重写 重写的规则 重写和重载的区别 1.4静态和动态绑定 1.5向上转型和向下转型 1.向上转型 2.向下转型 1.6多态的优点 前言 本文内容:多…

OpenHarmony开源三方库的cmake在IDE上直接引用的问题

前言 DevEco Studio的native工程的C/C部分当前只支持cmake脚本的编译,工程的目录结构如下图所示 在工程中引用第三方库有如下三种方式, 一、find_package模式 通过find_package,可以在指定目录下去搜索已安装的库(三方库构建完后…

【Linux】详解如何利用共享内存实现进程间通信

一、共享内存(Shared Memory)的认识 共享内存(Shared Memory)是多进程间共享的一部分物理内存。它允许多个进程访问同一块内存空间,从而在不同进程之间共享和传递数据。这种方式常常用于加速进程间的通信,因…

Linux - 线程

目录 一.Linux线程的概念 1.1什么是线程 1.2 线程的优点 1.3 线程的缺点 1.4 线程异常 1.5 线程用途 二. Linux进程VS线程 2.1 进程和线程 三. Linux线程控制 3.1 POSIX线程库 3.2 创建线程 3.3 进程ID和线程ID 3.4 线程ID及进程地址空间布局 3.5 线程终止 3.6 线…

SASE:打造数据安全保障新模式

在企业纷纷拥抱数字业务的过程中,由于边缘计算、云服务、混合网络的逐渐兴起,使得本就漏洞百出的传统网络安全架构更加岌岌可危,而且远远无法满足企业数字业务的需要。 伴随企业全球化发展,企业的数据中心不再是用户与设备访问需…

全球7大指纹浏览器排行榜:哪个最适合你?

在数字时代,我们每一次上网都会留下独特的数字足迹,被称为“浏览器指纹”。为了保护这些私人信息不被滥用,指纹浏览器成为了一个重要工具。但是,并非所有的指纹浏览器都是一样的,它们各有特点,适用于不同的…

【春季发布】LinkSLA智能运维V6.0发布 聚焦架构升级 新增带外管理

LinkSLA智能运维为企业IT部门提供覆盖资源管理、监控告警、IT服务台、日志管理、MOC值守服务等多项功能为一体的运维平台,通过打通各业务单元、贯穿各技术栈,以故障定位和全生命周期管理为核心,持续保障业务连续性。 本次V6.0版本全面升级&a…