[NIO日记](3)Channel

简介: Java NIO的通道类似流,但又有些不同:既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。通道可以异步地读写。

Java NIO的通道类似流,但又有些不同:

  • 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的

  • 通道可以异步地读写

  • 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入

正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:

1. Channel实现

这些是Java NIO中最重要的通道的实现:

  • FileChannel   从文件中读写数据。

  • DatagramChannel  能通过UDP读写网络中的数据。

  • SocketChannel  能通过TCP读写网络中的数据。

  • ServerSocketChannel  可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。


下面是一个使用FileChannel读取数据到Buffer中的示例:

 
  
  1. private static void test1(){
  2. try {
  3. RandomAccessFile aFile = new RandomAccessFile(NIODemo.class.getResource("/a.txt").getPath(), "rw");
  4. FileChannel fileChannel = aFile.getChannel();
  5. ByteBuffer buf = ByteBuffer.allocate(48);
  6. int bytesRead = fileChannel.read(buf);
  7. while (bytesRead != -1) {
  8. System.out.println("Read " + bytesRead);
  9. buf.flip();
  10. while(buf.hasRemaining()){
  11. System.out.print((char) buf.get());
  12. }
  13. buf.clear();
  14. bytesRead = fileChannel.read(buf);
  15. }
  16. aFile.close();
  17. } catch (FileNotFoundException e) {
  18. e.printStackTrace();
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. }

备注:

buf.flip() 的调用,首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取数据。下一节会深入讲解Buffer的更多细节。




目录
相关文章
|
5月前
|
存储 编解码 移动开发
技术笔记:NIO流—理解Buffer、Channel概念和NIO的读写操作
技术笔记:NIO流—理解Buffer、Channel概念和NIO的读写操作
35 1
|
6月前
|
缓存 网络协议 Java
📌 Java NIO Channel
Java NIOChannel和传统的流相似,但是也存在一些差异: • 在同一个Channel通道中,既可以进行 读操作 也可以进行 写操作,但是 流 只能进行 读 或者 写 其中一种操作。 • Channel通道可以进行异步读写。 • Channel可以从 Buffer中进行读写操作。将数据从Channel通道读取到Buffer缓冲区,并将数据从Buffer缓冲区写入Channel通道。
|
存储 网络协议 Java
Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
选择器,也叫多路复用器,Java的NIO通过selector实现一个线程处理多个客户端链接,多个channel可以注册到同一个Selector,Selector能够监测到channel上是否有读/写事件发生,从而获取事件和对事件进行处理,所以Selector切到哪个channel是由事件决定的。当线程从某个客户端通道未读取到数据时,可以把空闲时间用来做其他任务,性能得到了提升。
154 0
|
弹性计算 Java API
Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
理解Selector 和 Channel Selector 选择器,也叫多路复用器,可以同时处理多个客户端连接,多路复用器采用轮询机制来选择有读写事件的客户端链接进行处理。 通过 Selector ,一个 I/O 线程可以并发处理 N 个客户端连接和读写操作,这解决了传统同步阻塞 I/O 一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。 由于它的读写操作都是非阻塞的,这就可以充分提升 IO 线程的运行效率,避免由于频繁 I/O 阻塞导致的线程挂起。
249 0
|
缓存 网络协议 Java
Java NIO学习(二):Channel通道
Java NIO 的通道类似流,但又有些不同:
167 0
Java NIO学习(二):Channel通道
|
Java API
NIO学习三-Channel
在学习NIO时,ByteBuffer、Channel、Selector三个组件是必须了解的。前面我们说到ByteBuffer是作为缓冲区进行数据的存放或者获取。通常我们需要进行flip翻转操作,但是这个在Netty中,有一个更为强大的类可以替代ByteBuf,其不需要进行翻转,也可以进行读写的双向操作。要将数据打包到缓冲区中,通常需要使用通道,而通道作为传输数据的载体,也即它可以使数据从一端到另一端,因此就必须进行了解。 Channel中,我们也看到其子类有很多,通常都是用于读写操作的。其中ByteChannel可以进行读写操作,也即可以进行双向操作。 操作过程:首先创建流对象,有了流对象获取
86 0
NIO学习三-Channel
java Nio (四) :通道(Channel)
java Nio (四) :通道(Channel)
|
网络协议 Java
腾讯四面:说说你对Java NIO的通道Channel的理解
- Channel是双向的,我们既可以向Channel中写数据,也可以从Channel中读取数据。但流的读写通常是单向的。
156 0
|
网络协议 安全 Java
小师妹学JavaIO之:NIO中Channel的妙用
小师妹学JavaIO之:NIO中Channel的妙用
小师妹学JavaIO之:NIO中Channel的妙用
J3
|
Java API
详解,NIO中的通道(Channel)
这是 IO 相关的第三篇通道,主要讲解一下通道是什么,在 Java NIO 中的体系及使用。能被称为 NIO 中的三大组件之一作用肯定是不言而喻的,所以对于通道的掌握还是很重要的,那我们往下看把!
J3
286 0
详解,NIO中的通道(Channel)