IO的基础认识

一、IO的定义

IO 即“IN”和“OUT”的组合,IO流用来处理设备之间的数据传输,Java程序中,对于数据的输入/输出操作 都是以“流”的方式进行的。java.io包下提供了各种“流”类的接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
比如我们常用的System.out.print()就是io的应用
创建一个好的I/O系统不是一件容易的事,难度似乎来自于需要覆盖所有的可能性。因为不仅存在各种I/O源端(文件、控制台、网络连接等),还需要以多种不同的方式与这些I/O源端(顺序、随机、缓冲、二进制、按字符、按行、按字)进行通信。Java类库的设计者通过创建大量的类来解决这个问题。

二、IO的分类

1、从数据来源或者说是操作对象角度来分类:

在这里插入图片描述

2、从数据传输方式或者说是运输方式角度来分:
字节流和字符流区别:

字节流读取单个字节,字符流读取单个字符(一个字符根据编码的不同,对应的字节也不同,如 UTF-8 编码是 3 个字节,中文编码是 2 个字节。)字节流用来处理二进制文件(图片、MP3、视频文件),字符流用来处理文本文件(可以看做是特殊的二进制文件,使用了某种编码,人可以阅读)。简而言之,字节是个计算机看的,字符才是给人看的。
在这里插入图片描述
虽然,Java IO 相关的类确实很多,但我们并不是所有的类都会用到,我们常用的也就是文件相关的几个类,如文件最基本的读写类 File 开头的、文件读写带缓冲区的类 Buffered 开头的类,对象序列化反序列化相关的类 Object 开头的类。

三、IO常用类的常用方法

IO 类虽然很多,但最基本的是 4 个抽象类:InputStream、OutputStream、Reader、Writer。最基本的方法也就是一个读 read() 方法、一个写 write() 方法。方法具体的实现还是要看继承这 4 个抽象类的子类,毕竟我们平时使用的也是子类对象。这些类中的一些方法都是(Native)本地方法、所以并没有 Java 源代码,这里给出笔者觉得不错的 Java IO 源码分析 传送门,按照上面这个思路看,先看子类基本方法,然后在看看子类中还新增了那些方法,相信你也可以看懂的,我这里就只对上后面说的常用的类进行总结。
InputStream类:

方法方法介绍
public abstract int read()读取数据
public int read(byte b[])将读取到的数据放在 byte 数组中,该方法实际上是根据下面的方法实现的,off 为 0,len 为数组的长度
public int read(byte b[], int off, int len)从第 off 位置读取 len 长度字节的数据放到 byte 数组中,流是以 -1 来判断是否读取结束的(注意这里读取的虽然是一个字节,但是返回的却是 int 类型 4 个字节)
public long skip(long n)跳过指定个数的字节不读取
public int available()返回可读的字节数量
public void close()读取完,关闭流,释放资源
public synchronized void mark(int readlimit)标记读取位置,下次还可以从这里开始读取,使用前要看当前流是否支持,可以使用 markSupport() 方法判断
public synchronized void reset()重置读取位置为上次 mark 标记的位置
public boolean markSupported()判断当前流是否支持标记流,和上面两个方法配套使用

OutputStream类:

方法方法介绍
public abstract void write(int b)写入一个字节,可以看到这里的参数是一个 int 类型,对应上面的读方法,int 类型的 32 位,只有低 8 位才写入,高 24 位将舍弃。
public void write(byte b[])将数组中的所有字节写入,和上面对应的 read() 方法类似,实际调用的也是下面的方法。
public void write(byte b[], int off, int len)将 byte 数组从 off 位置开始,len 长度的字节写入
public void flush()强制刷新,将缓冲中的数据写入
public void close()关闭输出流,流被关闭后就不能再输出数据了

再来看 Reader 和 Writer 类中的方法,你会发现和上面两个抽象基类中的方法很像。

Reader 类:

方法方法介绍
public int read(java.nio.CharBuffer target)读取字节到字符缓存中
public int read()读取单个字符
public int read(char cbuf[])读取字符到指定的 char 数组中
abstract public int read(char cbuf[], int off, int len)从 off 位置读取 len 长度的字符到 char 数组中
public long skip(long n)跳过指定长度的字符数量
public boolean ready()和上面的 available() 方法类似
public boolean markSupported()判断当前流是否支持标记流
public void mark(int readAheadLimit)标记读取位置,下次还可以从这里开始读取,使用前要看当前流是否支持,可以使用 markSupport()
public void reset()重置读取位置为上次 mark 标记的位置
abstract public void close()关闭流释放相关资源

Writer 类:

方法方法介绍
public void write(int c)写入一个字符
public void write(char cbuf[])写入一个字符数组
abstract public void write(char cbuf[], int off, int len)从字符数组的 off 位置写入 len 数量的字符
public void write(String str)写入一个字符串
public void write(String str, int off, int len)从字符串的 off 位置写入 len 数量的字符
public Writer append(CharSequence csq)追加吸入一个字符序列
public Writer append(CharSequence csq, int start, int end)追加写入一个字符序列的一部分,从 start 位置开始,end 位置结束
public Writer append(char c)追加写入一个 16 位的字符
abstract public void flush()强制刷新,将缓冲中的数据写入
abstract public void close()关闭输出流,流被关闭后就不能再输出数据了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值