Java之标准I/O总结

在这里插入图片描述

1. 流的概念

在Java程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。流涉及的领域很广:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流等等。

在这里插入图片描述

流具有方向性,至于是输入流还是输出流则是一个相对的概念,一般以程序为参考,如果数据的流向是程序至外部,我们成为输出流,反之我们称为输入流。
可以将流想象成一个“水流管道”,水流就在这管道中形成了,自然就出现了方向的概念。

2. I/O分类
2.1 按流的方向

I/O的流向一般是以程序为参考对象,如果数据的流向是从外部到程序,称为输入流;如果数据的流向从程序到外部,称为输出流。

2.2 按流传输的数据单元

如果程序是以字节作为最小读写数据,称之为字节流;以字符作为最小读写数据单元,称之为字符流

I/O按流传输的数据单元划分的思维导图:

在这里插入图片描述

  • 字符流一般用来处理文本数据;字节流还可以用来处理媒体数据,如视频、音频、图片等,所以字节流更加通用。
  • 如果存在字节与字符之间的转换,需要涉及到编码过程。如果字节与字符在转换过程中使用不同的编码方式,那么就会出现乱码。需要注意这一点,我们在开发中建议一般都采用UTF-8编码方式
2.3 按流的功能

从/向一个特定的IO设备(如磁盘,网络)或者存储对象(如内存数组)读/写数据的流,称为节点流;对一个已有流进行连接和封装,通过封装后的流来实现数据的读/写功能,称为处理流(或称为过滤流);

在这里插入图片描述

节点流I/O类名是由节点流类型+抽象流类型组成,常见的节点类型有:

  • File文件
  • Piped管道
  • ByteArray / CharArray(字节数组/字符数组)

PipedInputStream类与PipedOutputStream类用于在应用程序中创建管道通信。一个PipedInputStream实例对象必须和一个PipedOutputStream实例对象进行连接而产生一个通信管道。PipedOutputStream可以向管道中写入数据,PipedIntputStream可以读取PipedOutputStream向管道中写入的数据.这两个类主要用来完成线程之间的通信。一个线程的PipedInputStream对象能够从另外一个线程的PipedOutputStream对象中读取数据。

处理流I/O类名由对已有流封装的功能+抽象流类型组成,常见功能有:

  • 缓冲:对节点流读写的数据提供了缓冲的功能,数据可以基于缓冲批量读写,提高效率。常见有BufferInputStream、BufferOutputStream
  • 字节流转换为字符流:由IuputSreamReader、OutputStreamWriter实现
  • 字节流与基本类型数据相互转换:这里基本数据类型如int、long、short,由DataInputStream、DataOutputStream实现
  • 字节流与对象实例相互转换:用于实现对象序列化,由ObjectInputStream、ObjectOutputStream实现

处理流应用了适配器/装饰模式,转换/扩展已有的流,处理流的创建通常是在构造函数传入已有的节点流或处理流

I/O按功能划分的思维导图:

在这里插入图片描述

3. 四个基本抽象流

java.io包中包含了标准I/O所需要的所有类,虽然很多,但所有I/O都是基于这四个基本抽象流,分别处理字节流和字符流:

  • InputStream
  • OutputStream
  • Reader
  • Writer

在这里插入图片描述

在实际开发中,我们对字节流的操作比较多。字节流的读写方法,都是针对于 byte ,并且读取时,流是以返回值是否为 -1 来判断是否读取结束的。

// InputStream
// 读取一个字节,返回的是读取的字节
public abstract int read()
// 将读取的字节数据存放在放到byte数组中
public int read(byte b[])
// 从第off位置读取len长度字节的数据放到byte数组中,
public int read(byte b[], int off, int len)

// OutputStream
// 写入一个字节
public abstract void write(int b)
// 写入一个字节数组
public void write(byte b[])
// 将byte数组从off位置开始,以len长度的字节写入
public void write(byte b[], int off, int len)

4. 参考

Java I/O体系从原理到应用,这一篇全说清楚了

看完这个,Java IO从此不在难

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值