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. react项目实现多语言切换

    网站的语言切换功能大家都见过不少,一般都是一个下拉框选择语言,如果让我们想一下怎么实现这个功能,我相信大家都是有哥大概思路,一个语言切换的select,将当前的选择的语言存在全局,根据这个语言的key ...

  2. MVVM框架三巨头之Vue的前世今生。

    前端有三宝,Angular,Vue,React.目前这三大主流JS框架已经成三分之势.其中的React框架是由脸书开发的,今天我们就来聊一聊VueJS的前世今生. 前世 在2013年的js开发者大会上 ...

  3. python进阶(20) 正则表达式的超详细使用

    正则表达式   正则表达式(Regular Expression,在代码中常简写为regex. regexp.RE 或re)是预先定义好的一个"规则字符率",通过这个"规 ...

  4. IP掩码的作用

    IP地址&IP掩码==网段,即,与上掩码后相同的IP属于同一网段.

  5. Nginx使用Lua模块实现WAF

    前言:最近一段时间在写加密数据功能,对安全相关知识还是缺少积累,无意间接触到了WAF相关知识,刚好Nginx可以实现WAF功能,也简单学习了Lua这门语言,分享下 一.WAF产生的背景 过去企业通常会 ...

  6. 性能测试工具JMeter 基础(三)—— 创建测试计划

    如何创建一个完整的测试计划? 安装好JMeter后,通过根目录下的bin目录中的jmeter.bat启动JMeter 添加线程组(Thread Group) 在 Test Plan 鼠标右键 Add- ...

  7. Linux环境搭建及项目部署

    一. VMWare安装图解 1.点击下一步 2.接受条款,下一步 3.选择安装目录,不建议有中文目录和空格目录.下一步 4.下一步 5.这两个选项根据可以爱好习惯选择,下一步 6.安装 7.完成 9. ...

  8. 2021 年 9 月 TIOBE 指数 C# 增长突破 1.2%

    TIOBE 编程社区指数是编程语言流行程度的指标.该指数每月更新一次.评级基于全球熟练工程师.课程和第三方供应商的数量.谷歌.必应.雅虎.维基百科.亚马逊.YouTube 和百度等流行搜索引擎用于计算 ...

  9. python轻量级orm框架 peewee常用功能速查

    peewee常用功能速查 peewee 简介 Peewee是一种简单而小的ORM.它有很少的(但富有表现力的)概念,使它易于学习和直观的使用. 常见orm数据库框架 Django ORM peewee ...

  10. web服务器之Ser-U和NFS

    1. Ser-U加载页面目录/文件列表 2. Ser-U下载文件 3. NFS服务器加载目录/文件列表 4. NFS服务器下载文件 4. 对比分析 Ser-U服务器在传输服务器端的目录时,使用的为xm ...