Java中常见流的分类及简单讲解
流在Java中是指计算中流动的缓冲区。
从外部设备流向中央处理器的数据流成为“输入流”,反之成为“输出流”。
字符流和字节流的主要区别:
1.字节流读取的时候,读到一个字节就返回一个字节;字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时。先去查指定的编码表,将查到的字符返回。
2.字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
1.字节流:
字节输入流类:FileInputStream、BufferedInputStream和DataInputStream
FileInputStream:此类用于从本地文件系统中读取文件内容。
构造方法:
·FileInputStream(File file):打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定。
·FileInputStream(String name):打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名name指定。
常用方法:
·int available():返回下一次对此输入流调用的方法不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。
·void close():关闭此文件输入流并释放与该流关联的所有系统资源。
BufferedInputStream:此类本身带有一个缓冲区,在读取数据时,先放到缓冲区中,可以减少对数据源的访问,提高运行的效率。
构造方法:
·BufferedInputStream(InputStream in):创建一个BufferedInputStream并保存其参数,即输入流in,以便将来使用。
·BufferedInputStream(InputStream in,int size):创建一个具有指定缓冲区大小的BufferedInputStream并保存其参数,即输入流in,以便将来使用。
常用方法:
·int available():返回下一次对此输入流调用的方法不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。
·void close():关闭此输入流并释放与该流关联的所有系统资源。
·int read():从输入流中读取数据的下一个字节。
·int read(byte[] b,int off,int len):从此字节输入流中给定偏移量处开始将各字节读取到指定的byte数组中。
DataInputStream:该类提供一些基于多字节读取方法,从而可以读取基本数据类型的数据。
构造方法:
·DataInputStream(InputStream in):使用指定的底层InputStream创建一个DataInputStream。
常用方法:
·int read(byte[] b):从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组b中。
·int read(byte[] b,int off,int len):从包含的输入流中将最多len个字节读入一个byte数组中。
字节输出流类:FileOutputStream、BufferedOutputStream和DataOutputStream
FileOutputStream:此类用于从本地文件系统的文件中写入数据。
构造方法:
·FileOutputStream(File file):创建一个向指定File对象表示的文件中写入数据的文件输出流。
·FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的输出文件流。
常用方法:
·void close():关闭此文件输出流并释放与此流有关的所有系统资源。
·FileDescriptor getFD():返回与此流有关的文件描述符。
·void write(byte[] b):将b.length个字节从指定byte数组写入此文件输出流中。
·void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此文件输出流。
·void write(int b):将指定字节写入此文件输出流。
BufferedOutputStream:此类本身带有一个缓冲区,在写入数据时,先放到缓冲区中,实现缓冲的数据流。
构造方法:
·BufferedOutputStream(OutputStream out):创建一个新的缓冲输出流,来将数据写入指定的底层输入流。
·BufferedOutputStream(OutputStream out,int size):创建一个新的缓冲输出流,来将具有指定缓冲区大小的数据写入指定的底层输出流。
常用方法:
·void flush():刷新此缓冲的输出流。
·void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此缓冲的输出流。
·void write(int b):将指定的字节写入此缓冲的输出流。
DataOutputStream(OutputStream out):创建一个新的数据输出流,将数据写入指定基础输出流。
常用方法:
·void flush():清空此数据输出流。
·int size():返回计数器written的当前值,即到目前为止写入此数据输出流的字节数。
·void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入基础输出流。
·void write(int b):将指定字节(参数b的八个低位)写入基础输出流。
2.字符流:
FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。
构造方法:
·FileReader(File file):在给定从中读取数据的File的情况下创建一个新的FileReader。
·FileReader(String fileName):在给定从中读取数据的文件名的情况下创建一个新的FileReader。
BufferedReader类是Reader类的子类,为Reader对象添加字符缓冲器,为数据输入分配内存存储空间,存取数据更为有效。
构造方法:
·BufferedReader(Reader in):创建一个使用默认大小输入缓冲区的缓冲字符输入流。
·BufferedReader(Reader in,int sz):创建一个使用指定大小输入缓冲区的缓冲字符输入流。
操作方法:
·void close():关闭该流并释放与之关联的所有资源。
·void mark(int readAheadLimit):标记流中的当前为止。
·boolean markSupported();判断此流是否支持mark()操作。
·int read():读取单个字符。
·int read(char[] cbuf,int off,int len):将字符读入数组的某一部分。
·String readLine():读取一个文本行。
·boolean ready():判断此流是否已准备好被读取。
·void reset():将流重置到最新的标记。
·long skip(long n):跳过字符。
FileWriter:用来写入字符文件的便捷类,可用于写入字符流。
构造方法:
·FileWriter(File file):根据给定的File对象构造一个FileWriter对象。
·FileWriter(String filename):根据给定的文件名构造一个FileWriter对象。
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
Java输入/输出流体系中常用的流分类(表内容来自java疯狂讲义)
注:下表中带下划线的是抽象类,不能创建对象。粗体部分是节点流,其他就是常用的处理流。
流分类 | 使用分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
抽象基类 | InputStream |
OutputStream |
Reader | Writer | |
节点流 | 访问文件 | FileInputStream | FileOutStream | FileReader | FileWriter |
访问数值 | ByteArrayInputStream | ByteArrayOutStream | CharArrayReader | CharArrayWriter | |
访问管道 | PipedInputStream | PipedOutStream | PipedReader | PipedWriter | |
访问字符串 | StringReader | StringWriter | |||
处理流 | 缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
转换流 | InputStreamReader | OutputStreamWriter | |||
对象流 | ObjectInputStream | ObjectOutputStream | |||
抽象基类(过滤) | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter | |
打印流 | PrintStream | PrintWriter | |||
推回输入流 | PushbackInputStream | PushbackReader | |||
特殊流 | DataInputStream | DataOutputStream |
——————————————————————————————————————————————————————————————————
总结:
1.Java IO是采用的是装饰模式,即采用处理流来包装节点流的方式,来达到代码通用性。
2.处理流和节点流的区分方法,节点流在新建时需要一个数据源(文件、网络)作为参数,而处理流需要一个节点流作为参数。
3.处理流的作用就是提高代码通用性,编写代码的便捷性,提高性能。
4.节点流都是对应抽象基类的实现类,它们都实现了抽象基类的基础读写方法。其中read()方法如果返回-1,代表已经读到数据源末尾。
参考链接:https://www.cnblogs.com/lca1826/p/6427177.html
参考链接:https://www.cnblogs.com/moonpool/p/5488463.html
转载于:https://www.cnblogs.com/xiohao/p/8997401.html
Java中常见流的分类及简单讲解相关推荐
- 10.6-全栈Java笔记:常见流详解(四)
上节我们讲到「Java中常用流:数据流和对象流」,本节我们学习文件字符流和文件缓冲流~ 文件字符流 前面介绍的文件字节流可以处理所有的文件,但是字节流不能很好的处理Unicode字符,经常会出现&qu ...
- Java中IO流的分类和BIO,NIO,AIO的区别
到底什么是IO 我们常说的IO,指的是文件的输入和输出,但是在操作系统层面是如何定义IO的呢?到底什么样的过程可以叫做是一次IO呢? 拿一次磁盘文件读取为例,我们要读取的文件是存储在磁盘上的,我们的目 ...
- java 中常用框架、intell idea简单使用、爬虫系统
学习:http://www.ityouknow.com/spring-boot.html http://blog.didispace.com/spring-boot-learning-1/ ***in ...
- Java 中按文件名称分类,按文件大小分类,按照文件类型分类,按照最后修改时间分类的工具类
在此博客中用到了文件操作的工具类,可以连接 Java中实现复制文件到文件,复制文件到文件夹,复制文件夹到文件,删除文件,删除文件夹,移动文件,移动文件夹的工具类 package cn.edu.hact ...
- java io流_浅谈IO流(一)-流的基本概念以及java的常见流
对于任何程序设计语言而言,输入输出(Input/Output)系统都是非常核心的功能.程序运行需要数据,数据的获取往往需要跟外部系统进行通信,外部系统可能是文件.数据库.其他程序.网络.IO设备等等. ...
- java中常见的数据结构分类
自己总结了下java中常见的数据结构和分类 在这里,我总结了list中数据结构对应我们所学的线性表,属于顺序存储还是链式存储,但没有总结set数据结构对应我们所学的哪一种(按理说应该是集合),是因为t ...
- java中logger_Java日志系统---Logger之简单入门
Java 中自带的日志系统,今天抽空了解了一点,算是入了门,所以将自己的一些心得记录下来,以备日后查看,有兴趣的朋友,看到此文章,觉得有错误或需要添加的地方,请在下方评论留言,大家可以共同进步,谢谢: ...
- java中functional interface的分类和使用
文章目录 简介 Functional Interface Function:一个参数一个返回值 BiFunction:接收两个参数,一个返回值 Supplier:无参的Function Consume ...
- java中policelisten的用法,中考英语简单句和主谓一致专项语法复习
中考简单句和主谓一致 一.单项填空 1.Across from my home, a shop which sells things from foreign countries. A.it is B ...
最新文章
- 然并卵:BF 科普 BF 解释器的 JS 实现
- 嵌入式Tomcat容器的参数(maxParameterCount)设定
- 编写你的第一个 Django 应用,第 2 部分
- Spring中@Async
- 土耳其电信与华为签署5G协议谅解备忘录
- iOS-OC-APP热更新,动态更新(仿QQ打开或关闭某个功能)
- python删除数据库的数据完整代码_轻松掌握Python对数据库的增、删、改、查
- 转:UIViewController中各方法调用顺序及功能详解
- 安卓现盗号木马 威胁网银盗刷
- layui 表单 验证整数
- 眼镜店计算机信息管理情况介绍,眼镜店家,你了解消费者吗?——M市眼镜市场调查报告...
- 主流的推荐系统算法总结
- Casbin访问控制框架入门详解及Java案例示范
- CSS动画入门:一分钟实现球体上下跳动动画效果
- poj 3070 Fibonacci(矩阵快速幂求Fibonacci数列)
- 如何实现中文汉字进行笔划(笔画)排序?
- mysql + excel 校正线上数据
- Android 开发:(十四)NavigationBar篇-自定义顶部导航栏
- 【转载】抽象语法树简介(有图)
- 使用Excel计算T检测的具体操作步骤
热门文章
- asset文件夹路径 unity_Unity3D研究院之手游开发中所有特殊的文件夹
- 区块链开发指南_区块链软件开发详解
- python强制转型,python2--python3如何转型
- python jdk安装_环境搭建:1.JDK安装配置
- n3k配置vpc是否还需要配置hsrp_HSRP
- 搜索鸿蒙系统,鸿蒙系统更进一步,华为上线搜索服务,HMS有望替代谷歌GMS
- 解决远程主机不能cv问题
- dorado 刷新_dorado BDF常见问题
- elementui如何在input 框中搜索_【挑战自学Python编程】第八天:while循环以及input()函数...
- 6748如何设置edma为事件触发方式_全面分析前端的网络请求方式