本文将继续上一篇《Netty、Redis、Zookeeper高并发实战》(二)整理第三章的内容。
我们继续看看NIO Channel(通道)类
主要介绍其四种最为主要的Channel(通道)实现:FileChannel、SocketChannel、ServerSocketChannel、DatagramChannel。
(1)FileChannel文件通道,用于文件的数据读写。
(2)SocketChannel套接字通道,用于Socket套接字TCP连接的数据读写。
(3)ServerSocketChannel服务器监听通道,允许我们监听TCP连接请求,为每个监听到的请求,创建一个SocketChannel套接字通道。
(4)DatagramChannel数据报通道,用于UDP协议的数据读写。
这四种通道,涵盖了文件IO、TCP网络、UDP IO基础IO。
使用FileChannel完成文件复制的实例
package com.netty.echo.nio.iodemo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class FileNIOCopyDemo {
public static void nioCopyFile(String srcPath, String destPath) {
File srcFile = new File(srcPath);
File destFile = new File(destPath);
FileInputStream fis = null;
FileOutputStream fos = null;
FileChannel inChannel = null;
FileChannel outChannel = null;
try {
if (!destFile.exists()) {
destFile.createNewFile();
}
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(destFile);
inChannel = fis.getChannel();
outChannel = fos.getChannel();
int length = -1;
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024);
//从输入通道读取到byteBuffer
while ((length = inChannel.read(byteBuffer)) > 0) {
//Buffer翻转切换到读模式
byteBuffer.flip();
int outLength = 0;
//将byteBuffer写入到输出的通道
while ((outLength = outChannel.write(byteBuffer)) != 0) {
}
//清空byteBuffer,并切换到写模式
byteBuffer.clear();
}
//强制刷新磁盘
outChannel.force(true);
} catch (IOException e) {
e.printStackTrace();
}finally {
closeQuietly(outChannel);
closeQuietly(fos);
closeQuietly(inChannel);
closeQuietly(fis);
}
}
public static void closeQuietly(java.io.Closeable o) {
if (null == o) return;
try {
o.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
网友评论