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()
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 ();// 设置写模式