快速上手
在上文之中,我们介绍了传统的 Socket 编程所带来的问题,
这一篇就来看一下具体的编程
一、简介
在了解了基础的概念之后,我们就来学习一下 NIO 的基本开发方式。
1) 对于客户端,客户端发起请求以后不使用IO流了,而是换成了一种称之为 channel 的东西,每个客户端连接对应于一个 channel
2) 对于服务端,引入了一个 Selector 来实现网络IO,他能够监控到客户端的请求,监控他的运行情况
二、Channel
IO通信的通道,类似于 InputStream,OutputStream,注意 。常见的Channel有以下几种,其中 FileChannel 主要用于文件的传输,其余三种用于网络的操作。
markdown
1. 文件操作
FileChannel,读写文件中的数据。
2. 网络操作
SocketChannel,通过TCP读写网络中的数据。
ServerSockectChannel,监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。
DatagramChannel,通过UDP读写网络中的数据。
markdown
1. FileInputStream/FileOutputStream
2. RandomAccessFile
3. Socket
4. ServerSocket
5. DatagramSocket
三、Buffer
3.1 简介
Channel 读取或者写入的数据,都要写到Buffer中,才可以被程序操作,但是******。**对于读写模式的确定是站在 Buffer 的角度来写的
2)如何进行读写模式的区分?
- 转换为写模式
- 新创建的就是写模式
- 获取通过
clear
方法
- 转换为读模式
- 通过
flip
方法
- 通过
3.2 常见Buffer
3.2.1 介绍
虽然说,常见的有这几种,但是最为常用的就是ByteBuffer
markdown
1. ByteBuffer
2. CharBuffer
3. DoubleBuffer
4. FloatBuffer
5. IntBuffer
6. LongBuffer
7. ShortBuffer
8. MappedByteBuffer
3.2.2 获得方式
markdown
1. ByteBuffer.allocate(10);
# ByteBuffer buffer = ByteBuffer.allocate(10);
2. encode()
# ByteBuffer buffer = Charset.defaultCharset().encode("haolong\nhello\n");
四、示例
接下来,我们写一个示例,来梳理一下上面的过程
1)我们建一个txt文件,文件内容为:hello,coding
2)编写程序
java
@Slf4j
public class HelloWorld {
public static void main(String[] args) {
String filePath = System.getProperty("user.dir") + File.separator + "a.txt";
File file = new File(filePath);
try(FileInputStream fileInputStream = new FileInputStream(file);) {
// 1. 获取 channel
FileChannel channel = fileInputStream.getChannel();
// 2. 创建缓冲区
ByteBuffer byteBuffer = ByteBuffer.allocate(10);
int index = 0;
// 3. 通过 channel 将 信息放入到 ByteBuffer 之中
while((index = channel.read(byteBuffer)) != -1) {
// 4. 切换 ByteBuffer 为 读模式
byteBuffer.flip();
// 5. 如果说 ByteBuffer 之中还有内容
while (byteBuffer.hasRemaining()) {
// 6. 获取 ByteBuffer 之中的内容
byte b = byteBuffer.get();
log.info("读取到的信息为:{}",(char)b);
}
// 7. 重新设置 ByteBuffer 为读模式
byteBuffer.clear();
}
} catch (Exception e) {
log.error("读取文件过程之中出现异常",e);
}
}
}