1.java.nio.channels通道定义
2.Java的并行世界-Netty中线程模型源码讲解-续集Handler、Channel
3.《Java面向对象编程》导读-NIO包中Channel的用法,用FileChannel读写文件
java.nio.channels通道定义
通道(Channel)在Java NIO中表示到实体(如硬件设备、文件、网络套接字或程序组件)的开放连接,可以处于打开或关闭状态,淘宝源码查看并且支持异步关闭和中断操作。 多个接口扩展了Channel接口,提供了新的I/O操作。ReadableByteChannel接口定义了read方法,用于从通道读取字节到缓冲区;WritableByteChannel接口则定义了write方法,用于将字节从缓冲区写入通道。ByteChannel接口统一了这两个接口,FPS脚本源码用于可读写字节的常见通道。 ScatteringByteChannel和GatheringByteChannel接口扩展了ReadableByteChannel和WritableByteChannel接口,提供了使用缓冲区序列进行read和write的方法,而非单个缓冲区。 Channels实用工具类定义了静态方法,支持Java io包的流类和通道类的互操作。可以通过InputStream或OutputStream构造合适的通道,反之亦然。可以构造Reader使用指定的字符集解码来自可读取字节通道的字节,或者构造Writer使用指定的字符集将字符编码为字节,并将这些字节写入可写入字节通道。扩展资料
java.nio.channels定义了各种通道,领取q会员源码这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。Java的并行世界-Netty中线程模型源码讲解-续集Handler、Channel
Netty 的核心组件 ChannelHandler 在网络应用中扮演着关键角色,它处理各种事件和数据,实现业务逻辑。ChannelHandler 子类众多,根据功能可分为特殊Handler(如Context对象)、出入站Handler,以及用于协议解析和编码的Decoder和Encoder。例如,ChannelInboundHandlerAdapter 和 ChannelOutboundHandlerAdapter 分别用于处理入站和出站事件,aruba无线平台源码ByteToMessageDecoder 和 MessageToByteEncoder 则负责数据的解码和编码。
特殊Handler如ChannelHandlerContext 提供了处理器与Channel交互的上下文,而ChannelDuplexHandler 则用于双向通信,如聊天服务器。SimpleChannelInboundHandler 是简化版的入站处理器,自动管理消息引用,避免内存泄漏。而出站处理器如SimpleChannelOutboundHandler 则在消息处理后自动释放引用,简化编码流程。
Channel 是数据传输的抽象,NioServerSocketChannel 和 EpollServerSocketChannel 分别对应基于NIO和Epoll的服务器端套接字。ChannelInitializer 是iapp软件盒子源码初始化新Channel的关键,它配置处理器形成处理链,用于处理连接操作和事件,从而实现自定义业务逻辑。
通过理解这些概念和类的作用,可以构建和配置Netty应用,以满足不同的网络通信需求。想要深入学习,可以研究Netty 4.1源码中如EventLoopGroup、ChannelPipeline、CustomChannelInitializer等核心类。后续会分享详细的中文注释版本,持续关注以获取更多资源和知识。
《Java面向对象编程》导读-NIO包中Channel的用法,用FileChannel读写文件
通道Channel在Java中用于连接缓冲区与数据源或数据汇。读写数据时,数据源的数据经过通道到达缓冲区,缓冲区的数据经过通道到达数据汇。
Channel接口只有两个方法,用于通道的创建与关闭。Channel接口的两个主要子接口分别是ReadableByteChannel和WritableByteChannel。
ReadableByteChannel接口提供read(ByteBuffer dst)方法,用于将数据源的数据读入到指定的ByteBuffer缓冲区中。WritableByteChannel接口提供write(ByteBuffer src)方法,用于将指定的ByteBuffer缓冲区中的数据写到数据汇中。
ByteChannel接口是ReadableByteChannel和WritableByteChannel的便利接口,支持读写操作。ScatteringByteChannel接口扩展了ReadableByteChannel,允许分散地读取数据。ScatteringByteChannel接口提供read(ByteBuffer[] dsts)方法,用于将从数据源读取的数据依次填充到指定的ByteBuffer数组的各个ByteBuffer中。GatheringByteChannel接口扩展了WritableByteChannel,允许集中地写入数据。GatheringByteChannel接口提供write(ByteBuffer[] srcs)方法,依次将指定的ByteBuffer数组的每个ByteBuffer中的数据写到数据汇。
FileChannel类是Channel接口的实现类,代表一个与文件相连的通道。它同时实现了ByteChannel、ScatteringByteChannel和GatheringByteChannel接口,支持读操作、写操作、分散读操作和集中写操作。客户程序无法直接构造FileChannel对象,但可以通过FileInputStream、FileOutputStream和RandomAccessFile类的getChannel()方法获得。
FileChannel类的main()方法演示了其用法。首先,通过文件输出流获取FileChannel对象,然后通过它将ByteBuffer对象中的数据写入文件中。接着,通过RandomAccessFile对象获取FileChannel对象,定位到文件末尾,并向文件中写入字符串“朋友”。再从文件输入流中获取FileChannel对象,使用ByteBuffer.allocate()创建容量为1K的ByteBuffer对象,将文件数据读入缓冲区。接着调用flip()方法设置缓冲区的极限limit为当前位置,并将位置position设为0。之后,调用decode()方法将缓冲区数据转换为Unicode编码并打印,结果显示为“你好,朋友!”。
相关阅读推荐:知乎上有关Java面向对象编程、NIO包中缓冲区ByteBuffer用法详解以及Charset类进行字符编码转换的深入分析。参考自孙卫琴的经典Java书籍《Java面向对象编程》。