美文网首页
《Netty、Redis、Zookeeper高并发实战》(三)

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

作者: ZaneInTheSun | 来源:发表于2020-05-15 18:07 被阅读0次

    本文将继续上一篇《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高并发实战》(三)

          本文链接:https://www.haomeiwen.com/subject/oxvcohtx.html