IO流基本概念
IO流主要分为两类
- 节点流:直接能够进行数据写入或读取的I0流。可以单独执行读写操作,但是功能比较单一,只能进行一些基本
的操作。例如:FileInputStream
FileInputStream fis = new FileInputStream("");
- 包装流:自己本身不能够进行直接的数据读写,需要包装另外的一个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对象的为包装流
- 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流基本概念的更多相关文章
- java IO流的概念与分类
DataInputStream && ObjectInputStream 示例 https://blog.csdn.net/hoho_12/article/details/520543 ...
- Java修炼——IO流的概念以及其分类
IO流的基本概念: 流的原理: 1) 在 Java 程序中,对于数据的输入/输出操作以"流" (stream) 方式进行: 2) J2SDK 提供了各种各样的"流&quo ...
- IO流总结
IO流的作用:用于设备和设备之间的数据传输. IO流的概念:流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象. IO流的分类: 按照操作数据的类型分为两种: 字节流和字符流. 按 ...
- 乐字节Java之file、IO流基础知识和操作步骤
嗨喽,小乐又来了,今天要给大家送上的技术文章是Java重点知识-IO流. 先来看看IO流的思维导图吧. 一. File 在Java中,Everything is Object!所以在文件中,也不例外! ...
- Java IO 理解流的概念
Java IO 理解流的概念 @author ixenos 在理解流时首先理解以下概念 1.流的来源和去向一般在构造器指出 2.方法中的形参一般是将流输出到某个位置,读取(INPUT)流从流读出数据( ...
- io 流概念
io 流概念 对输入输出抽象的封装
- UNIX高级环境编程(6)标准IO函数库 - 流的概念和操作
标准IO函数库隐藏了buffer大小和分配的细节,使得我们可以不用关心预分配的内存大小是否正确的问题. 虽然这使得这个函数库很容易用,但是如果我们对函数的原理不熟悉的话,也容易遇到很多问题. 1 ...
- I-O流概念认知升级
在文件操作基础入门中,我们提到了流的 概念,这篇我们将更多的介绍流这个东西,以及C的I/O相关知识 现在,我们从C程序员最熟悉的printf函数开始学习I/O流. 我们对printf函数一直是很喜爱的 ...
- IO流的原理和概念
在程序中如何读写文件?不同的编程语言有不同的方式,而 JAVA 则提出了“流”的概念,通过“流”来读写文件 什么是流: 流(Stream)是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通 ...
随机推荐
- mysql优化: 内存表和临时表
由于直接使用临时表来创建中间表,其速度不如人意,因而就有了把临时表建成内存表的想法.但内存表和临时表的区别且并不熟悉,需要查找资料了.一开始以为临时表是创建后存在,当连接断开时临时表就会被删除,即临时 ...
- C语言预处理编译链接各个阶段错误,分阶段的说一下
C语言预处理编译链接各个阶段错误,分阶段的说一下 C语言预处理编译链接各个阶段错误,分阶段的说一下比如指针异常,数组下标越界什么的 我来答 1个回答 #热议# 你觉得这辈子有希望看到996消失 ...
- Json 文件 : 出现 Expected value at 1:0 问题的解决
只要找一个json在线解析,验证你的json文件格式的正确性,错误可以忽略. 如要消除红叉,关闭Json Validation即可,如下操作:
- CrackMe-CrackHead
转载自:OllyDbg入门教程 现在进入第三篇,这一篇我们重点讲解怎样使用 OllyDBG 中的函数参考(即名称参考)功能.仍然选择 crackmes.cjb.net 镜像打包中的一个名称为 Crac ...
- 跨域@RequestBody@RequestParam 和JSON.stringify
- pytorch 测试 迁移学习
训练源码: 源码仓库:https://github.com/pytorch/tutorials 迁移学习测试代码:tutorials/beginner_source/transfer_learning ...
- Linux档案权限篇之一
一.查看档案的属性 "ls" 第一列为档案的权限: d:代表是目录 -:代表是文件 l:代表是连接文件(相当于windows里面的快捷方式) b:代表块设备(如硬盘) c:代表字符 ...
- 移动端ios上下滑动翻页事件失效
移动端开发过程中,在添加上下滑动事件时候,引入了最常用的移动端库zepto.js及其touch模块,有一种现象,安卓的手机没有问题,上下滑动翻页很正常 :但是到了ios上面,好啊,上下滑动会出现弹性滚 ...
- Docker容器管理——Docker容器常用命令
1.查看所有的容器 docker ps 2.查看运行的容器 docker ps -a 3.启动.停止.重启docker容器 docker start ... docker stop ... docke ...
- adb 常用命令大全(3)- 查看手机设备信息
查看手机型号 adb shell getprop ro.product.model 查看电池状况 adb shell dumpsys battery 其中 scale 代表最大电量,level 代表当 ...