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. 用宏实现HEX到ASCII ,ASCII 到HEX

    #define HEX2ASCII(value, data)  do{  \            value = (value > 0x09)?(value+0x7):value; \     ...

  2. Java 大数加法HdAcm1002

    1 import java.util.Scanner; 2 3 4 public class Main { 5 public static void main(String[] args) { 6 S ...

  3. Sentinel限流、降级配置详解

    安装Sentinel 下载sentinel-dashboard-1.8.2.jar 安装有jdk环境,8080端口未被占用 在jar包所在目录打开cmd,输入命令启动:java -jar sentin ...

  4. Python - 文件模式a+读取不了文件

    代码 f = open('test/gbk.txt', 'a+', encoding='utf-8') print(f.readline()) 最终的执行结果是输出空,为什么呢? a+模式打开文件指针 ...

  5. Mysql常用sql语句(6)- limit 限制查询结果的条数

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 实际工作中,我们的数据表数据肯定都是万级别的,如 ...

  6. Git 系列教程(13)- 分支管理

    查看分支列表 $ git branch iss53 * master testing  注意 master 分支前的 * 字符:它代表现在 checkout 的那一个分支(也就是说,当前 HEAD 指 ...

  7. C# AutoMaper使用自定义主键

    有时候实际业务中主键不一定叫Id,比如示例数据库Northwind中的RegionID,TerritoryID等,本示例用Abp框架并以Northwind数据库Region表为数据依据 一.在Core ...

  8. CSS004. 自定义滚动条样式(webkit)

    CSS /* 滚动条宽度 */ ::-webkit-scrollbar { width: 6px; } /* 轨道样式 */ ::-webkit-scrollbar-track { backgroun ...

  9. SpringBoot-初见

    目录 简单介绍 什么是SpingBoot? 微服务 单体应用架构 微服务架构 怎么构建微服务 第一个SpringBoot程序 官方网站快速构建 IDEA 代码 自动装配(要点) pom.xml 启动器 ...

  10. 剑指offer计划16( 排序简单)---java

    1.1.题目1 剑指 Offer 45. 把数组排成最小的数 1.2.解法 这题看的题解,发现自己思路错了. 这里直接拿大佬的题解来讲吧. 一开始这里就把创一个string的数组来存int数组 Str ...