Java I/O的机制

前言

       I/O问题是整个人机交互的核心问题,同样Java提供了丰富的操作I/O的类,此处只讨论java.io包中的63个类(除去Exception类和Error类),根据数据格式和传输方式可以分成四类(平时可能使用最多的是字节流和字符流):

(1)基于字节操作的I/O接口:InputStream和OutputStream
(2)基于字符操作的I/O接口:Reader和Writer
(3)基于磁盘操作的I/O接口:File
(4)基于网络操作的I/O接口:Socket

1、基于字节的I/O操作接口

       基于字节操作的I/O接口输入和输出分别是InputStream和OutputStream,InputStream的类层次结构如下所示(输入流根据数据类型和操作方式又被划分为若干个子类):
InputStream类层次结构
InputStream提供的主要方法:

public int read(byte b[], int off, int len) throws IOException;

OutputStream的类层次结构与InputStream的结构类似:
OuputStream类层次结构

public void write(byte b[], int off, int len) throws IOException;

至于每个子类的具体操作方式和处理字节流的方式参考jdk1.8文档

2、基于字符的I/O操作接口

       在实际的磁盘操作或是网络操作中,操作的都是字节,而并不是字符,之所以有字符流之说是因为在实际程序中经常使用字符或者字符串,为了操作方便提供字符I/O接口。而不同的字符使用的编码不尽相同,这给在转换成字节时如果使用了不恰当的解码规则就会产生乱码,同时编解码本身也是一个耗时的操作。
       基于字符操作的I/O接口输入和输出分别是Reader和Writer,Reader的类层次结构如下所示:
Reader类层次结构
Reader提供的主要方法:

/**
* Reads characters into a portion of an array.  This method will block
* until some input is available, an I/O error occurs, or the end of the
* stream is reached.
*
* @param      cbuf  Destination buffer
* @param      off   Offset at which to start storing characters
* @param      len   Maximum number of characters to read
* @return     The number of characters read, or -1 if the end of the
*             stream has been reached
*
* @exception  IOException  If an I/O error occurs
*/
abstract public int read(char cbuf[], int off, int len) throws IOException;

Writer的类层次结构与Reader的结构类似:
这里写图片描述
Writer提供的主要方法:

/**
* Writes a portion of an array of characters.
*
* @param  cbuf  Array of characters
* @param  off   Offset from which to start writing characters
* @param  len   Number of characters to write
* @throws  IOException   If an I/O error occurs
*/
abstract public void write(char cbuf[], int off, int len) throws IOException;
3、字节与字符的转化接口

       数据持久化到磁盘或者在网络上传输的时候都是以字节形式处理的,Java针对字节与字符的转化提供了相应的接口:InputStreamReader和InputStreamWriter。InputStreamReader将字节流解码成字符,InputStreamWriter将字节流编码成字符,不管编码解码均须注意采用的字符集,两种转换均采用了适配器模式(通过InputStreamReader或者InputStreamWriter将InputStream适配成Reader或者Writer)。
字符解码过程(在StreamDecode中存在InputStream和Charset对象用于转化):
StreamDecoder

字符编码过程(StreamEncoder中存在OutputStream和Charset对象用于转化):
StreamEncoder

4、File
5、Socket
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值