《Netty、Redis、Zookeeper高并发实战》(三)

本文将继续上一篇《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();
        }
    }
}

你可能感兴趣的:(《Netty、Redis、Zookeeper高并发实战》(三))