IO流主要分为两类

  1. 节点流:直接能够进行数据写入或读取的I0流。可以单独执行读写操作,但是功能比较单一,只能进行一些基本

    的操作。例如:FileInputStream
FileInputStream fis = new FileInputStream("");
  1. 包装流:自己本身不能够进行直接的数据读写,需要包装另外的一个I0流,组装起来使用。包装流的作用就是增

    强另外一个流的功能。例如:InputStreamReader ,BufferedInputStream
FileInputStream fis = new FileInputStream("");
//对fis 进行包装
InputStreamReader isr = new InputStreamReader(fis);

节点流可以被包装,但是能够被包装的不一定是节点流。还可以是包装流,(包装流包装包装流(套娃!))

FileInputStream fis = new FileInputStream("");
//对fis 进行包装
InputStreamReader isr = new InputStreamReader(fis);
//套娃
BufferedInputStream bis = new BufferedInputStream(isr);

如何区分节点流和包装流

可以单独new出来,而不需要传入InputStream对象的就是节点流,必须传入InputStream对象的为包装流

  1. FileInputStream 与 BufferedInputStream 二者的区别

FileInputStream 是默认每次从文件中读取一个字节,这样子效率非常的低,于是我们一般使用一个byte类型的数组来当做缓冲区,使得每次读取byte数组长度的字节,这样子效率就会比较高。

而BufferedInputStream 就相当于多我们的缓冲区做了封装,我们不用自己去考虑缓冲区,它自己内部已经处理好

思考:BufferedInputStream 效率这么高,我们还需要FileInputStream 做什么呢?

对于不同的业务场景,使用的类也就不一样,BufferedInputStream 虽然效率很高,但是如果我们的业务需求对于文件中实时修改的文本也能在程序中输出出来,那么使用BufferedInputStream 就不是很合理;

因为对于BufferedInputStream 来说,默认的缓冲区大小是8kb,我们在第一次读取的时候就会读取8kb个字节的数据,如果我们对这些数据进行修改的话,我们在程序中拿到的还是修改前(存在于缓存中)的数据

我们可以实际测试一下:

测试文件demo.txt

AA

我们在使用BufferedInputStream 读取一个字节后睡眠5秒钟然后再读取下一个字节

    public static void main(String[] args) throws Exception {
String path = "src/main/java/com/xj/dayio/demo.txt";
FileInputStream fis = new FileInputStream(path);
BufferedInputStream bis = new BufferedInputStream(fis); int read1 = bis.read();
System.out.println((char)read1); Thread.sleep(5000); int read2 = bis.read();
System.out.println((char)read2);
}

当程序输出第一个“A”并且睡眠时,我们迅速修改demo.txt文件中的“AA”为“BB”,然后保存,我们可以看到该代码的第二次输出仍然是“A”

而我们使用FileInputStream 的话:依旧是上面的代码,只不过是将bis改为fis

    public static void main(String[] args) throws Exception {
String path = "src/main/java/com/xj/dayio/demo.txt";
FileInputStream fis = new FileInputStream(path); int read1 = fis.read();
System.out.println((char)read1); Thread.sleep(5000); int read2 = fis.read();
System.out.println((char)read2);
}

当程序输出第一个“A”并且睡眠时,我们迅速修改demo.txt文件中的“AA”为“BB”,然后保存,我们可以看到该代码的第二次输出改为了“B”。

虽然绝大多数情况下BufferedInputStream 是比FileInputStream 效率高,但是不能说FileInputStream 是没有用的,只不过是业务场景不同罢了。


IO流基本概念的更多相关文章

  1. java IO流的概念与分类

    DataInputStream && ObjectInputStream 示例 https://blog.csdn.net/hoho_12/article/details/520543 ...

  2. Java修炼——IO流的概念以及其分类

    IO流的基本概念: 流的原理: 1) 在 Java 程序中,对于数据的输入/输出操作以"流" (stream) 方式进行: 2) J2SDK 提供了各种各样的"流&quo ...

  3. IO流总结

    IO流的作用:用于设备和设备之间的数据传输. IO流的概念:流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象. IO流的分类:  按照操作数据的类型分为两种: 字节流和字符流.  按 ...

  4. 乐字节Java之file、IO流基础知识和操作步骤

    嗨喽,小乐又来了,今天要给大家送上的技术文章是Java重点知识-IO流. 先来看看IO流的思维导图吧. 一. File 在Java中,Everything is Object!所以在文件中,也不例外! ...

  5. Java IO 理解流的概念

    Java IO 理解流的概念 @author ixenos 在理解流时首先理解以下概念 1.流的来源和去向一般在构造器指出 2.方法中的形参一般是将流输出到某个位置,读取(INPUT)流从流读出数据( ...

  6. io 流概念

    io 流概念 对输入输出抽象的封装

  7. UNIX高级环境编程(6)标准IO函数库 - 流的概念和操作

    标准IO函数库隐藏了buffer大小和分配的细节,使得我们可以不用关心预分配的内存大小是否正确的问题. 虽然这使得这个函数库很容易用,但是如果我们对函数的原理不熟悉的话,也容易遇到很多问题.   1 ...

  8. I-O流概念认知升级

    在文件操作基础入门中,我们提到了流的 概念,这篇我们将更多的介绍流这个东西,以及C的I/O相关知识 现在,我们从C程序员最熟悉的printf函数开始学习I/O流. 我们对printf函数一直是很喜爱的 ...

  9. IO流的原理和概念

    在程序中如何读写文件?不同的编程语言有不同的方式,而 JAVA 则提出了“流”的概念,通过“流”来读写文件 什么是流: 流(Stream)是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通 ...

随机推荐

  1. Java之Apache Commons-IO使用精讲

    Commons IO是针对开发IO流功能的工具类库.主要包括六个区域: 工具类--使用静态方法执行共同任务输入--用于InputStream和Reader实现输出--用于OutputStream和Wr ...

  2. restore db fail

    System.Data.SqlClient.SqlError: The operating system returned the error '5(Access is denied.)' while ...

  3. Hibernate框架基本使用

    时间:2017-1-16 00:36 --什么是Hibernate    Hibernate是一个开放源代码的关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以使用对象编程思 ...

  4. The First Week luckyzpp

    一 ,LINUX系列有很多版本,只是我们很少去了解到更多,我们熟知红帽CentOS,Ubuntu,Debian,   Kali,  Rocky各种版本系列. 二 目前Linux 生产主流版本如下: C ...

  5. 基于Appium,封装自己的常用方法

    Appium算是老牌移动端App自动化测试工具了,在使用它的过程中,使用者经常会根据个人习惯,把较常用的方法封装在一起,方便调用.以下是我的封装,希望对你有启发. from typing import ...

  6. 集合框架2- ArrayList

    其实 Java 集合框架也叫做容器,主要由两大接口派生而来,一个是 collection,主要存放对象的集合.另外一个是Map, 存储着键值对(两个对象)的映射表. 下面就来说说 List接口,Lis ...

  7. SpringBoot 属性配置文件数据注入配置和yml与properties区别

    前言 我们知道SpringBoot 通过配置类来解放一堆的xml文件配置,通属性配置文件,来进行,系统全局属性配置,这样极大的简化了我们开发过程,java web 也可以甜甜的从此 快速配置 Spri ...

  8. 20210720 noip21

    又是原题,写下题解吧 Median 首先时限有 2s(学校评测机太烂,加到 4s 了),可以放心地筛 \(1e7\) 个质数并算出 \(s_2\),然后问题变为类似滑动求中位数.发现 \(s_2\) ...

  9. Walker

      emmm.......随机化.   好吧,我们不熟.   考虑随机选取两组数据高斯消元消除结果后带入检验,能有超过1/2正确就输出.   其实方程就四个,手动解都没问题.   只是要注意看sin与 ...

  10. java版gRPC实战之二:服务发布和调用

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...