JavaIO流:概述

news2024/10/5 21:21:07

在接触 IO 流前,无论是 变量的声明、数组的创建,又或者是复杂的并发设计还是 Jvm 的性能调优,我们更多的还是和内存打交道。但我们知道计算机组成包括运算器,控制器,存储器,输入设备,输出设备。也就是不仅仅只有内存和 CPU,所以程序设计语言必须要提供程序与外部设备交互的方式,这就是 IO 框架的由来。我们需要和外部设备进行数据的交互。

本篇内容包括:关于 IO 流、关于 Java IO 流、Java IO 层次体系结构


文章目录

    • 一、关于 IO 流
        • 1、IO 流的作用
        • 2、IO 流的介绍
    • 二、关于 Java IO 流
        • 1、关于 Java 文件IO
        • 2、输入输出流
        • 3、缓冲流
        • 4、Reader 和 Writer
    • 三、Java IO 层次体系结构


一、关于 IO 流

1、IO 流的作用

在接触 IO 流前,无论是 变量的声明、数组的创建,又或者是复杂的并发设计还是 Jvm 的性能调优,我们更多的还是和内存打交道。但我们知道计算机组成包括运算器,控制器,存储器,输入设备,输出设备。也就是不仅仅只有内存和 CPU,所以程序设计语言必须要提供程序与外部设备交互的方式,这就是 IO 框架的由来。我们需要和外部设备进行数据的交互。

2、IO 流的介绍

我们的系统和外部的交互主要依赖于 比特流(数据线里传播),比特就是 bit 的谐音,计算机中“位”的意思,代表 0 或 1。1 位或者 1bit,就是一个 0 或一个 1。但是,毕竟 0 或 1 不能表示什么,所以计算机更常见的基本单位是字节,也就是用 8 位 0 或 1 组成的一段数据。

既然计算机和外界进行信息的输入和输出交互,用的是比特流,那么很容易就能想到 IO 流名字的由来了。就是比喻输入输出的数据像流一样。我们可以这么认为,任何外部设备与内存之间输入输出的操作,都是需要输入输出流(IO流)来完成的,这里的 IO 流,指的就是比特流(或者称字节流。这些外部设备,包括,键盘(标准输入设备)、显示器(标准输出设备)、音响、网络上另一台主机,甚至你玩游戏用的游戏手柄,以及各种各样的信号传感器,都可以叫做外部设备,和这些设备之间进行数据交互,显然不可能靠之前学习的那些数组,集合,常用类,String 等等来完成。而是要靠和外界数据交换的类来完成。靠什么来进行数据交换,就是前面说的,比特流,或者说 IO 流类。


二、关于 Java IO 流

Java 对数据的操作是通过流的方式,IO 流用来处理设备之间的数据传输,上传文件和下载文件,Java 用于操作流的对象都在 IO 包中。

1、关于 Java 文件IO

既然要学习 IO 流,就得针对某一个输入输出设备来学习。哪种输入输出设备最重要同时也最常见?当然是硬盘。硬盘在这里的含义也可以理解为文件系统。(Java 程序是运行在某操作系统平台上的应用软件 JVM 上的,实际上 Java 程序可见的并不是硬盘,而是操作系统提供的文件系统,因此此处可直接理解为文件系统)。因此,我们学习 IO 流的时候,基本上是学习的 Java 如何操作文件系统,除了文件系统,我们还能够了解 Java 操作标准输入输出设备,如 System.in 和 System.out。

2、输入输出流

API 提供了两个顶层抽象类,用来表示操作所有的输出输出:InputStream、OutputStream。并且,这两个类表示字节的输入输出,因为输入输出的本质是字节流。这里注意体会一句话“字节流是最最基本的流”,这句话的由来就是因为计算机底层传递的就是字节。

img

当我们要操作文件的时候,就需要具体的对文件系统操作的 IO 实现类,于是就有了 FileInputStream 和 FileOutputStream,它们是文件输入输出字节流。这里之所以 FileInputStream/OutputStream 作为子类出现,按照面向对象思想理解就是,将来还有别的字节流来操作别的设备(比如将来需要通过操作网络设备获取网络数据,再比如需要操作机器人,那么或许就会再来个 RobotInputStream 和 RobotOutputStream,这些新的需求也就都可以继承这个体系)

3、缓冲流

学了文件 IO 字节流之后,我们会发现原始的字节流对象用起来没那么高效,因为每个读或写请求都由底层操作系统处理,这些请求往往会触发磁盘访问、网络活动或其他一些相对昂贵的操作。不带缓冲区的流对象,只能一个字节一个字节的读,每次都调用底层的操作系统 API,非常低效,而带缓冲区的流对象,可以一次读一个缓冲区,缓冲区空了才去调用一次底层 API,这就能大大提高效率。所以又有了 BufferedInputStream 和 BufferedOutputSteam,他们的用法是把字节流对象传入后再使用,也相当于把它俩套在了字节流的外面,给字节流装了个“外挂”,让基本字节流如虎添翼。

4、Reader 和 Writer

人们需要有能够处理字符的类,或者说这个类提供一个功能:就是把输入的字节转成字符,把要输出的字符转成计算机可以识别的字节。所以,你需要两个转换流:InputStreamReader 和 OutputStreamWriter。这两个类的作用分别是把字节流转成字符流,把字符流转成字节流。但是这两个流需要套在现成的字节流上才能使用,当中用到的设计模式也就是常说的装饰模式。当字节流被转成字符流之后,恭喜你,你可以不必操作字节流了,而是可以用人类的方式 read 和 write 各种“文字”。

还是回到文件系统,我们最常见的是和文件系统打交道,那么针对如此常见的用途,读取文本文件能不能用一种方便的方式呢?当然,大牛们替你想到并提供了。FileReader和FileWriter这两个流对象可以直接把文件转成读取、写入流。让你省去了创建字节流,再套上转换流的步骤。看看这类名起的,实际上很形象,xxxReader 和 xxxWriter,明摆着告诉你“阅读和书写”都是“人可以做的”也就是他们表示的是字符流。同理上面的 InputStreamReader 和 OutputStreamWriter,表示的是把字节流转成人可读的,把字节流转成人可写的。因此他们的顶层抽象类:Reader 和 Writer,表示的是所有人类可读可写的字符流统称。


三、Java IO 层次体系结构

在整个 Java.io 包中最重要的就是 5 个类和一个接口。5个类指的是 File、OutputStream、InputStream、Writer、Reader;一个接口指的是 Serializable 掌握了这些 IO 的核心操作那么对于 Java 中的 IO 体系也就有了一个初步的认识了

Java I/O主要包括如下几个层次,包含三个部分:

  • 流式部分:IO 的主体部分;
  • 非流式部分:主要包含一些辅助流式部分的类,如:File类、RandomAccessFile类和FileDescriptor等类;
  • 其他类:文件读取部分的与安全相关的类,如:SerializablePermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem 类。

主要的类如下:

  1. File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。

  2. InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。

  3. OutputStream(二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。

Java 中字符是采用 Unicode 标准,一个字符是 16 位,即一个字符使用两个字节来表示。为此,Java 中引入了处理字符的流。

  1. Reader(文件格式操作):抽象类,基于字符的输入操作。

  2. Writer(文件格式操作):抽象类,基于字符的输出操作。

  3. RandomAccessFile(随机文件操作):它的功能丰富,可以从文件的任意位置进行存取(输入输出)操作。

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

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

相关文章

springcloud4:服务注册中心Eureka

直接调用即可,为什么用Eureka什么是服务治理? 多个服务调用,需要有依赖中心管理什么是服务注册? 有一个注册中心,当服务器启动时,会把自己的信息注册到注册中心上什么是服务发现? Client通过注册…

electron打包ffi-napi报错 npm ERR! gyp reason: read ECONNRESET

问题描述 这个问题用了我两天的时间,所以记录一下。 我们项目是使用electronvue,做支付功能的时候需要使用到ffi-napi依赖包。 最后打包的时候ffi-napi报错了,在package.json中去掉ffi-napi就可以打包,但是打包运行后提示缺少ff…

re:Invent 2022,探秘亚马逊云科技的重量级计算创新——Nitro

诞生于16年前的亚马逊云科技,开创了一个全新的云计算领域。秉持着创新与探索精神,自2012年开始,在每年一度的re:Invent全球大会上,亚马逊云科技都会发布最新的云计算技术。对IT产业演进产生了革命性的影响,Nitro系统就…

Java笔记(工厂模式、动态代理、XML)

一、工厂模式 软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的复用性。 什么…

代码随想录算法训练营第四十三天| LeetCode1049. 最后一块石头的重量 II、LeetCode494. 目标和、LeetCode474. 一和零

一、LeetCode1049. 最后一块石头的重量 II 1:题目描述(1049. 最后一块石头的重量 II) 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将…

让你快速高效的掌握linux内核编译过程

Linux内核编译 一、linux内核的配置与编译: 1.配置内核 1)导入默认配置: make xxxx_defconfig 注1:xxxx表示内核支持的芯片的名称 比如make exynos_defconfig 注2:内核源码中对每个支持的芯片都有默认的配置,默认配置很…

【博学谷学习记录】超强总结,用心分享|架构师-RabbitMQ消息可靠性保障

文章目录一、生产者保证1.1 失败通知1.2 发送方确认1.3 Broker丢失消息二、消费方消息可靠性2.1 消费者手动确认消息依靠三个对象:生产者、消费者、broker一、生产者保证 生产者发送消息到broker时,要保证消息的可靠性,主要的方案有&#xf…

5.28 综合案例2.0-简易起夜灯

HaaS506 - 简易起夜灯简介准备硬件连接图功能实现1.继电器使用说明2. 5.8G雷达感应传感器模块说明3.简易代码3.1测试log简介 案例为了解决晚上起床找不到灯的问题。当你从床上起来时,雷达感应传感器检测到你的活动后自动打开电灯。省去了寻找电灯开关的麻烦。 准备…

java学习笔记 day07-Java基础-综合练习

练习一:飞机票 需求: ​ 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 ​ 按照如下规则计算机票价格:旺季(5-10月)头等舱9折,经济舱8.5折,淡季(11月到来…

表白墙(web版)

文章目录前言一、需求分析1.表白墙页面设计2.表白墙功能二、实现1.客户端2.服务器端3.连接数据库前言 前面前端部分写过一个表白墙页面,但是它不能存储提交信息,为了能够让它在提交信息后可以保存其信息,页面刷新后信息依然存在,…

itk配准整理(1)

示例地址: itk\ITK\Examples\RegistrationITKv4\ImageRegistration7.cxx 说明:itk二维图像的配准:平移旋转缩放 效果图: 运行结果: 52 53.6213 [0.8333298229719548, -0.17450270771316403, -12.806452097490313, -1…

在Win10中使用YAMAHA S-YXG50软波表

曾经非常经典的一款软波表YAMAHA S-YXG50我个人非常的喜欢。在XP系统的时代,是我必装的软件,用来听一些MIDI音质和效果很好。而如今玩MIDI的人越来越少了,软波表的时代也被人渐渐的遗忘了。 如今想要怀旧的话,只能够找一台老电脑…

LINUX的XEN和KVM到底区别在什么地方?

本文调研的是 Completely Fair Scheduler 算法, 它当前是 Linux 中 SCHED_NORMAL(非实时任务) 一类 task 的默认调度器. 实际上, 运行在 Guest OS 中的应用程序线程还受到 Guest OS 的调度, 分时运行在 vCPU 上, 但这不在本文调研范围内. 本文仅调研 vCPU 被如何调度到 pCPU 上…

WebDAV之葫芦儿·派盘+无聊笔记

无聊笔记 支持webdav方式连接葫芦儿派盘。 无聊笔记是一款深受用户认可的系统工具,随时都可以进行软件的操作,也可以在线进行笔记的记录,系统会进行智能的保存,满足了用户日常中的需求,可以把软件作为备忘录,笔记本,摘抄录等。 无聊笔记是一个功能强大的记录工具,您…

代码随想录算法训练营第四十二天| LeetCode416. 分割等和子集

一、LeetCode416. 分割等和子集 1:题目描述(416. 分割等和子集) 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 2:解题思路 本题需要使用01背包的…

合作动态 | 方正璞华与日立签订战略合作协议,加快推进数字化管理变革!

2022年10月27日,方正璞华PLM事业部负责人王志起先生与日立方代表正式签订“方正璞华PLM产品销售合作框架协议”。 根据协议,双方将围绕璞华PLM产品推广、客户拓展、全生命周期运营服务等领域,开展多元化、多层级的深度融合合作,共…

HTML制作一个介绍自己家乡的网站——贵阳,排版整洁,内容丰富,主题鲜明

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有…

CV:计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念)、早期/中期/近期应用领域(偏具体应用)、经典CNN架构(偏具体算法)概述、常用工具/库/框架/产品、环境安装、常用数据集、编程技巧

CV:计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念)、早期/中期/近期应用领域(偏具体应用)、经典CNN架构(偏具体算法)概述、常用工具/库/框架/产品、环境安装、常用数据集、编程技巧 导读:计算机视觉技最强学习路线,博主花了三个晚…

Class加载过程

文章目录java解释执行热点代码编译类生命周期加载(Loading)验证(Verification)准备(Preparation)解析(Resolution)初始化(Initialization)使用(Us…

并发编程(三)原子性(2)

【 悲观锁与乐观锁 】: 【悲观锁】: 一定会被别人打断;我必须得上锁。synchronized就是悲观锁。 【乐观锁】: 乐观锁又称之为——无锁、自旋锁、CAS 。 厕所里的人认为不会有其他人来上厕所和我竞争。 【举例解释CAS操作】&a…