首页 > 代码库 > NIO
NIO
NIO主要有三大核心部分:
通道:Channel
缓冲区:Buffer
选择器:Selector
通道负责传输,缓冲区负责存储,选择器用于监听多个通道的事件。比如:连接打开,数据到达
传统IO基于字节流和字符流进行操作,而NIO基于管道和缓冲区进行操作。数据总是从通道读取到缓冲区,或者从缓冲区写入到通道中。
IO和NIO的区别:
1.IO是面向流(单向的)的,NIO是面向缓冲区(可读可写)的。
2.IO是阻塞的,NIO是非阻塞的
通道可以异步的读写。
Channel
最重要的实现类:
FileChannel:从文件中读写数据
DatagramChannel:通过UDP读写网络中的数据
SocketChannel:通过TCP读写网络中的数据
ServerSocketChannel:可以web服务器一样监听新进来的TCP连接,每个连接都会创建一个SocketChannel
Channel与Stream的区别在于:
Channel是双向的,而Stream只能是单向的(Stream必须是InputStream或者OutputStream的一个子类,即要么是输入流,要么是输出流,不能即输入又输出)。Channel在被打开之后,即可以读,也可以写,或者同时进行读写操作。 因为Channel是双向的,因此它比Stream更好的反应了底层操作系统IO的实质。特别是在Linux系统中,底层操作系统都是双向的。
=======================================================
任何发送到Channel的数据都必须先放进Buffer
Channel
获取通道的方式:
1.通过流来获取
- FileInputStream
- FileOutputStream
- RandomAccessFile
- DatagramSocket
- Socket
- ServerSocket
例如:
FileInputStream fis = new FileInputStream("D:\\1.txt");
FileChannel channel = fis.getChannel();
2.通过Files类的静态方法newByteChannel()获取字节通道。
或者通过通道的静态方法open()打开并返回指定通道。
步骤
读取文件:
1.创建输入流,并从输入流中获取通道(Channel)
2.创建缓冲区
3.将数据读入缓冲区
写入数据到文件:
1.
FileInputStream fis = new FileInputStream("D:\\1.txt");
NIO