io概述及其分类

2023-09-16 18:35:18

一、IO概念

• I/O 即输入Input/ 输出Output的缩写,其实就是计算机调度把各个存储中(包括内存和外部存储)的数据写入写出的过程;
I : Input
O : Output
通过IO可以完成硬盘文件的读和写。

• java中用“流(stream)”来抽象表示这么一个写入写出的功能,封装成一个“类”,都放在http://java.io这个包里面。

二、来理解“流”是什么?

通过“流”的形式允许java程序使用相同的方式来访问不同的输入/输出源。stream是从起源(source)到接收的(sink)的有序数据。我们这里把输入/输出源对比成“水桶”,那么流就是“管道”,这个“管道”的粗细、单向性等属性也就是区分了不同“流”的特性。

三、IO流的分类

在这里插入图片描述

可以从两个不同的维度进行分类:

• 1、按照流的方向(输出输入都是站在程序所在内存的角度划分的)
• 输入流:只能从中读取数据【主要由InputStream和Reader作为基类】

• 输出流:只能向其写入数据【主要由outputStream和Writer作为基类】

在下图中,从磁盘读取数据到内存是输入流,从客户端读取数据到server是输入流;同样,把内存数据写到磁盘是输出流,把server数据写到client是输出流
按照 流的方向 进行分类:
以内存作为参照物:
往内存中去:叫做输入(Input)。或者叫做读(Read)。
从内存中出来:叫做输出(Output)。或者叫做写(Write)。

• 2、按照流的操作颗粒度划分
按照 读取数据方式 不同进行分类:

• 字节流:

按照 字节 的方式读取数据,一次读取1个字节byte,等同于一次读取8个二进制位。
这种流是万能的,什么类型的文件都可以读取。包括:文本文件,图片,声音文件,视频文件 等…以字节为单元,可操作任何数据【主要由InputStream和outPutStream作为基类】

eg.
假设文件file1.txt,采用字节流的话是这样读的:
a中国bc张三fe
第一次读:一个字节,正好读到’a’
第二次读:一个字节,正好读到’中’字符的一半。
第三次读:一个字节,正好读到’中’字符的另外一半。

• 字符流

按照 字符 的方式读取数据的,一次读取一个字符.
这种流是为了方便读取 普通文本文件 而存在的,这种流不能读取:图片、声音、视频等文件。只能读取 纯文本文件,连word文件都无法读取。以字符为单元,只能操作纯字符数据,比较方便【主要由Reader和Writer作为基类】

注意:
纯文本文件,不单单是.txt文件,还包括 .java、.ini、.py 。总之只要 能用记事本打开 的文件都是普通文本文件。

eg.
假设文件file1.txt,采用字符流的话是这样读的:
a中国bc张三fe
第一次读:'a’字符('a’字符在windows系统中占用1个字节。)
第二次读:'中’字符('中’字符在windows系统中占用2个字节。)

综上所述:流的分类:

输入流、输出流
字节流、字符流

四、IO流四大家族首领

字节流
java.io.InputStream 字节输入流
java.io.OutputStream 字节输出流
字符流
java.io.Reader 字符输入流
java.io.Writer 字符输出流
注意:
1.四大家族的首领都是抽象类。(abstract class)
2.所有的流都实现了:java.io.Closeable接口,都是可关闭的,都有 close() 方法。
流是一个管道,这个是内存和硬盘之间的通道,用完之后一定要关闭,不然会耗费(占用)很多资源。养成好习惯,用完流一定要关闭。
3.所有的 输出流 都实现了:java.io.Flushable接口,都是可刷新的,都有 flush() 方法。
养成一个好习惯,输出流在最终输出之后,一定要记得flush()刷新一下。这个刷新表示将通道/管道当中剩余未输出的数据强行输出完(清空管道!)刷新的作用就是清空管道。
ps:如果没有flush()可能会导致丢失数据。

4.在java中只要“类名”以 Stream 结尾的都是字节流。以“ Reader/Writer ”结尾的都是字符流。

更多推荐

Java synchronized关键字常见面试题

1、什么是线程同步,为什么需要线程同步?线程同步是一种机制,用于控制多个线程对共享资源的访问,以防止并发问题。它需要确保在同一时刻只有一个线程可以访问共享资源,以避免数据竞争和不一致性。2、请解释Java中synchronized关键字的作用和用法。synchronized关键字用于实现线程同步。它可以应用于方法或代码

0021Java程序设计-SSM框架图书管理系统

文章目录摘要目录系统设计开发环境摘要伴随着时代的进步,以及科学技术的不断发展,越来越多的人会从图书馆中借阅书籍,从而获得新的知识。但是,传统的图书管理方法有着很多不便之处,而且还容易丢失,因此,很有必要设计出一个易于操作,具有高便捷性,还可以提高工作效率的图书管理系统。该系统采用了Java技术,采用了计算机技术,取代了

python经典百题之请问他多少岁

题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?方法1:迭代deffind_fifth_person_age_iterative():age=10#第一个

Multitor:一款带有负载均衡功能的多Tor实例创建工具

关于MultitorMultitor是一款带有负载均衡功能的多Tor实例创建工具,Multitor的主要目的是以最快的速度完成大量Tor进程的初始化,并将大量实例应用到我们日常使用的程序中,例如Web浏览器和聊天工具等等。除此之外,在该工具的帮助下,我们还可以在进行渗透测试和对基础设施安全性进行审计时提高隐蔽性和匿名性

4、wireshark使用教程

文章目录一、wireshark简介二、环境三、wireshark抓包三、wireshark过滤器使用一、wireshark简介Wireshark是使用最广泛的一款「开源抓包软件」,常用来检测网络问题、攻击溯源、或者分析底层通信机制。Wireshark抓包原理:单机情况:电脑直连互联网的单机环境。Wireshark直接抓

HR对职业发展进行思考

如果你还没有职业发展方面的思考,请不要怪自己,这很正常。没有谁是一开始就会如此清晰理性地对职业发展进行思考。笔者对职业发展有关话题进行系统性的思考,得益于两本书:第一本是哈佛大学泰勒·本-沙哈尔教授的《幸福的方法》,第二本书是美国学者比尔·博内特和戴夫·伊万斯写的《斯坦福大学人生设计课》,这两本书给了笔者很大的启发,并

【无标题】

未来,该算法可以在低延迟视频编码领域得到广泛应用。例如,该算法可以用于实时视频传输、视频会议、视频监控等场景,以提高视频编码的效率和质量。此外,该算法还可以扩展到其他编码平台,如H.264/AVC、VP9等,以满足不同应用场景的需求。关于每个图和公式的位置,以下是简要说明:图1:位于第2页,显示了所提出的速率控制算法的

MySQL备份与恢复

目录一、数据库备份二、数据备份的重要性三、MySQL完全备份优缺点实例:完全备份MySQL物理冷备份及恢复完全备份指定库中的部分表完全备份MySQL,服务器中所有的库完全备份一个或多个完的库(包括其中所有的表)查看备份文件MySQL完全恢复恢复数据库恢复数据表MySQL增量备份基于位置恢复基于时间点恢复一、数据库备份备

MySQL安装(1)

安装环境:Win1064位软件版本:MySQL5.7.24解压版一、下载点开下面的链接:https://downloads.mysql.com/archives/community/选择选择和自己系统位数相对应的版本点击右边的Download,此时会进到另一个页面,同样在接近页面底部的地方找到如下图所示的位置:不用理会

数据库知识

1、count(1),count(*),count(列名)的区别和联系?当表的数据量很大时候,count(1)比count(*)更加消耗时间,如果count(1)是聚索引那么count(*)会更快一些,因为count(*)会自动优化指定哪一字段。综上所述,count(1)和count(*)基本没有区别!count(1)

【C语言】可变参数列表详解

可变参数列表一、可变参数列表的使用1、可变参数列表的形式2、可变参数列表的提取3、使用演示4、利用可变参数实现一个简单的日志打印功能二、可变参数列表的原理1、原理的讲解2、原理的证明一、可变参数列表的使用1、可变参数列表的形式有时我们在使用C语言时可能会碰到这样的情况,希望函数带有可变数量的参数,而不是预定义数量的参数

热文推荐