IO流学习记录

IO流
流:一组有顺序的,有期待你和终点的字节集合,是对数据传输的总称或抽象。
Q:java中有几种类型的流?
按流的方向分:输入流(inputStream)和
输出流
(outputStream)
输入和输出是站在内存的角度来讲

按照事先功能来分:节点流(可以从或向一个特定的地方(节点)读写数据。例如FileReader)和处理流(是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写,如BffuerdeReader,处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接)

按照数据处理单元分:字节流字符流。

Q:字节流和字符流的区别
处理数据的方式不同:字节流读取的时候,读到一个字节就返回一个字节;字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在 UTF-8 码表中是 3 个字节)时,先去查指定的编码表,再将查到的字符返回。
处理单元和操作对象不同:字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。
字节流可以处理所有类型数据,如:图片, MP3, AVI 视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
字节流的抽象基类是InputStream(输入流-读)和OutputStream(输出流-写);
字符流的抽象基类是Reader(输入流-读)和Writer(输出流,写)。

由抽象基类派生出来的子类名称都是以其父类名作为子类名的后缀。这句话很重要,由此可以很简单的从众多流中判断出是属于字节流还是字符流。
在这里插入图片描述
在这里插入图片描述
象基类都不能直接实例化,我们只能对其子类进行实例化

FileOutputStream和FileInputStream
FileInputStream和FileOutputStream是针对文件系统的数据传输而定制的字节流。

构造参数需要指定一个File类的对象或者直接指定文件名(路径):FileOutputStream(File file),FileOutputStream(String name);FileOutputStream(File file, boolean append)用来追加写入(默认是换行)。

FileInputStream的构造方法:FileInputStream(File file),FileInputStream(String name)。

如果是创建FileOutputStream对象来写入数据时,当文件不存在时会自动创建;
如果是创建FileInputStream对象来读出数据时,文件不存在就会报FileNotFoundException异常。

BufferedInputStream和BufferedOutputStream
字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,Java本身在设计的时候,也考虑到了这样的设计思想(装饰设计模式后面讲解),所以提供了字节缓冲流以提高读写效率。它只是一个缓冲区,真正的操作还是要靠流来进行,只是用它做个容器,其本身并没有什么特有的方法。

字节缓冲流就属于我们前面提到的处理流,在其构造是通常需要传入字节流(FileOutputStream和FileInputStream),同时可以指定缓冲区的大小。

字符流
字符流适合来操作文本文件,字符流使用字节流读到一个或多个字节(中文对应的字节数是两个,在 UTF-8 码表中是 3 个字节)时,先去查指定的编码表,再将查到的字符返回。可以简单的理解为字符流=字节流+编码表。
字符流用来处理字符数据,字符流提供了操作字符、字符数组或字符串的读写方法,其抽象基类是Reader和Writer。
与字节流输出流OutputStream比起来,Writer中提供了五种写入数据的方法,分别用来写入字符,字符数组,字符数组的一部分,字符串,字符串的一部分。同时提供了追加写入的方法append()。

转换流InputStreamReader和OutputStreamWriter
InputStreamReader和OutputStreamWriter分别是Reader和Writer的子类。

既然字符流是依托于字节流而存在的,那么必然要存在一定的机制可以将字节流转换成字符流。转换流InputStreamReader和OutputStreamWriter就是用来完成这一任务的,它们的构造参数可以传入字节流对象:
FileReader和FileWriter
FileWriter和FileReader分别是OutputStreamWriter和InputStreamReader的子类。很多情况下我们并不需要指定字符集,Java给我们提供了字符流便捷类。
BufferedReader和BufferedWriter
前面已经讲到,使用缓冲区可以明显提高读写效率,与字节缓冲流的BufferedInputStream和BufferedOutputStream相对应,字符流也提供了自己的字符缓冲流。

BufferedWriter是高效的字符输出流,而BufferedReader是高效的字符输入流。

原文链接:https://blog.csdn.net/qq_44238142/article/details/100064894

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值