NIO入门学习(一)

1.IO基于字节流和字符流进行数据传递,而NIO则是基于通道和缓冲区进行实现.

NIO核心组件
1.Chanel(通道)
2.Buffer(缓冲)
3.Selector(选择器)

Chanel
1.既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
2.通道可以异步地读写。
3.通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。
常用的Chanel:
FileChannel 从文件中读写数据。

DatagramChannel 能通过UDP读写网络中的数据。

SocketChannel 能通过TCP读写网络中的数据。

ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。

Buffer
Buffer三大核心:position,limit,capacity.
position表示读写的位置.limit则表示写入的数据的大小.capacity则表示这个Buffer的容量.
position会随着数据的读写向下移动,最开始为0,最大为capacity-1.limit在写的时候等于capacity,在读的时候就是写入的数据的最大值(不一定等于capacity但是一定小于等于capacity).
可以这么理解:buffer是一百米长度的路,我们在这一百米中走的步数就是就是position,我们走了多少米则就是limit(仅限于读数据,因为已知大小.).
Buffer的API.
flip():翻转的意思,即我们可以从通道往缓冲里写东西,也可以从缓冲中读取数据.调用该方法之后即读写反转.
clear():在读取数据之后,调用该方法会将缓冲中的数据清空,但是并未清除,即调用该方法会将我们还未读完的数据遗忘.又从头开始.
compact():在读取数据的时候,如果调用了该方法,则会将未读取的数据移动到position的位置,这样就保证了数据完整的读取.

package org.freebird.nio;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class Demo {

    public static void main(String[] args) throws IOException {
        RandomAccessFile raf = new RandomAccessFile("D:\\Film\\boyblue.txt", "rw");
        FileChannel rafChannel = raf.getChannel();
        // 定义一个初始容量的buffer
        ByteBuffer byteBuffer = ByteBuffer.allocate(48);
        //得到文件中有多少字节
        int pos = rafChannel.read(byteBuffer);
        while (pos != -1) {
            System.out.println("READ:"+pos);
            //反转开始读取
            byteBuffer.flip();
            while (byteBuffer.hasRemaining()) {
                System.out.print((char)byteBuffer.get());
            }
            byteBuffer.clear();
            pos = rafChannel.read(byteBuffer);
        }
        raf.close();
    }
}

打印结果:

READ:38
hey,can u here me hey boy blue is back

参考:http://ifeve.com/buffers/

你可能感兴趣的:(NIO)