表中列出了InputStream类的方法,其中最常用的是三个重载的read()方法和close()方法,read()方法是从流中逐个读入字节,int read(byte[] b)方法和int read(byte[] b, int off, int len)方法是将若干字节以字节数组形式一次性读入,提高读数据的效率。操作I/O流时会占用宝贵的系统资源,当操作完成后,应该将I/O所占用的系统资源释放,这时就需要调用close()方法关闭流。
介绍完InputStream类的相关方法,接下来要介绍一下它所对应的OutputStream类的相关方法,如表所示。
表中,三个重载的write()方法都是向输出流写入字节,其中,void write(int b)方法是逐个写入字节;void write(byte[] b) 方法和void write(byte[] b, int off, int len) 方法是将若干个字节以字节数组的形式一次性写入,提高写数据的效率;flush()方法用于将当前流的缓冲区中数据强制写入目标文件;close()方法用来关闭此输出流并释放系统资源。
InputStream和OutputStream都是抽象类,不能实例化,所以要实现功能,需要用到它们的子类,接下来先了解一下这些子类。
如图所示。
ØNIO概述
NI/O( New Input/Output)也称为New I/O。是一种基于通道和缓冲区的I/O方式,与之前学习面向流的I/O相比,NI/O是面向缓存的,其效率会提高很多。而且,NI/O是一种同步非阻塞的I/O模型,会不断轮询I/O事件检查其是否准备就绪,在等待I/O的时候,可以同时做其他任务。
在NI/O中同步的核心就是Selector,Selector代替了线程本身轮询I/O事件,避免了阻塞的同时减少了不必要的线程消耗;非阻塞的核心就是通道和缓冲区,当I/O事件就绪时,可以通过写道缓冲区,保证I/O的成功,而无需线程阻塞式地等待。在J ava API中提供了两套NI/O,一套是针对标准输入输出NI/O,另一套就是网络编程NI/O。
面向流的I/O一次一个字节地处理数据,一个输入流产生一个字节,一个输出流就消费一个字节。但是面向流的I/O通常处理的很慢。面向块的I/O系统以块的形式处理数据。每一个操作都在一步中产生或消费一个数据块。按块要比按流快的多,但面向块的I/O缺少了面向流I/O所具有的简单性。
(1)I/O与NI/O对比区别如表所示。