二、NIO的基本开发方式

channel 简介

IO 通信的通道，类似于 InputStream、OutputStream

Channel 没有方向性

常见 Channel

文件操作
FileChannel，读写文件中的数据。

网络操作
SocketChannel，通过 TCP 读写网络中的数据。
ServerSockectChannel，监听新进来的 TCP 连接，像 Web 服务器那样。对每一个新进来的连接都会创建一个 SocketChannel。
DatagramChannel，通过 UDP 读写网络中的数据。

获得 channel 的方式

FileInputStreanm/FileOutputStream

RandomAccessFile

Socket

ServerSocket

DatagramSocket

Buffer 简介

Channel 读取或者写入的数据，都要写到 Buffer 中，才可以被程序操作。

因为 Channel 没有方向性，所以 Buffer 为了区分读写，引入了读模式、写模式进行区分。

常见 buffer

ByteBuffer 常用

CharBuffer

DoubleBuffer

FloatBuffer

IntBuffer

LongBuffer

ShortBuffer

MappedByteBuffer.. 常用

获得 buffer 的方式

ByteBuffer.allocate(10);

encode()

Copy
package nio;

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
* NIO channel 和 buffer 使用
* **/
public class Main {
public static void main(String[] args) throws IOException {

// 1. 获取文件的channel
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Administrator\\IdeaProjects\\untitled\\1.txt");
FileChannel channel = fileInputStream.getChannel();

// 创建buffer
ByteBuffer buffer = ByteBuffer.allocate(10);

while(true){
// 从channel中读取数据，buffer刚创建时为写模式，所以无需切换模式
// channel.read 返回的int 如果是-1 代表没有数据了，相反则返回读取的字节数量
int read = channel.read(buffer);

// 返回为-1时，结束循环
if (read == -1)break;

// 设置为读模式
buffer.flip();

// 循环读取buffer中的数据,buffer.hasRemaining()可以判断buffer中是否还有数据
while (buffer.hasRemaining()){
byte b = buffer.get();
System.out.println((char)b);
}

// 最后读完数据切换为写模式（在这个程序中不写也能运行，但读完切换模式是良好的编程习惯，日后会少遇到很多麻烦）
buffer.clear();
}

}
}

NIO 开发的步骤总结

获取 Channel

创建 Buffer

channel.read (buffer); // 循环的从 Channel 中获取数据，读入到 Buffer 中。进行操作 。
buffer.flip ();// 设置读模式
buffer.get (); 循环从 buffer 中获取数据。
buffer.clear ();// 设置写模式