Java NIO之Channel详细理解

通俗编程——白话NIO之Channel Channel简介在标准的IO当中,都是基于字节流/字符流进行操作的,而在NIO中则是是基于Channel和Buffer进行操作,其中的Channel的虽然模拟了流的概念,实则大不相同。 阅读详情

介绍

理解:通道是一个连接I/O服务的管道并提供与该服务交互的方法。

Channel类似于传统的”流”,但是Channel不能直接访问数据,需要和缓冲区Buffer进行交互。

通道和传统流的区别:

  1. 通道可以是双向的,既可以读取数据,又可以写数据到通道。但流的读写通常是单项的

  2. 通道可以异步的读写

  3. 通道不能直接访问数据,需要和Buffer进行交互

 

 

通道可以简单的分为两大类:文件通道和Socket通道

文件通道

       文件通道的主要实现是FileChannel。文件通道总是阻塞的,因此不能被置于非阻塞模式。

   FileChannel的创建

        FileChannel对象不能直接创建。一个FileChannel实例只能通过一个打开的file对象(RandomAccessFil、FileInputStraem、FileOutputStream等)上调用getChannel(0方法获取。调用getChannel()方法返回一个连接到相同文件的FileChannel对象且该FileChannel对象具有于file对象相同的访问权限。

 

创建FileChannel示例:

  //创建一个RandomAccessFile(随机访问文件)对象,
  RandomAccessFile raf=new RandomAccessFile("D:\\test.txt", "rw");

  //通过RandomAccessFile对象的getChannel()方法。FileChannel是抽象类。
  FileChannel inChannel=raf.getChannel();

常用方法 

 package java.nio.channels;

    public abstract class FileChannel extends AbstractChannel implements ByteChannel, GatheringByteChannel, ScatteringByteChannel

    {

        // This is a partial API listing
        // All methods listed here can throw java.io.IOException
        //从FileChannel读取数据
        public abstract int read(ByteBuffer dst)
        public abstract int read (ByteBuffer dst, long position);

        //向FileChannel写数据
        public abstract int write(ByteBuffer src)
        public abstract int write (ByteBuffer src, long position);

        //获取文件大小
        public abstract long size();

        //获取位置
        public abstract long position();

        //设置位置
        public abstract void position (long newPosition);

        //用于文件截取
        public abstract void truncate (long size);

        //将通道里尚未写入磁盘的数据强制写到磁盘上
        public abstract void force (boolean metaData);

        //文件锁定,position-开始位置,size-锁定区域的大小,shared-表示锁是否共享(false为独占),lock()锁定整个文件
        public final FileLock lock();
        public abstract FileLock lock (long position, long size, boolean shared);
        public final FileLock tryLock();
        public abstract FileLock tryLock (long position, long size, boolean shared);

        //内存映射文件
        public abstract MappedByteBuffer map (MapMode mode, long position, long size);
        public static class MapMode;
        public static final MapMode READ_ONLY;
        public static final MapMode READ_WRITE;
        public static final MapMode PRIVATE;

        //用于通道之间的数据传输
        public abstract long transferTo (long position, long count, WritableByteChannel target);
        public abstract long transferFrom (ReadableByteChannel src, long position, long count);
    }

     

public abstract MappedByteBuffer map (MapMode mode, long position, long size)

    该map()方法可以在一个打开的文件和一个特殊类型的ByteBuffer之间建立虚拟内存映射。

     通过内存映射机制来访问一个文件会比使用常规方法读写高效得多,甚至比使用通道的效率都高。

transferTo()将数据从FileChannel传输到其他的Channel中。

transferFrom()从其他Channel获取数据

transferTo()和transferFrom()方法允许将一个通道交叉连接到另一个通道,而不需要通过一个中间缓存来传递数据。只有FileChannel类有这两个方法。

 

transferFrom()示例

package test;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;


public class FileChannelTest2 {
    public static void main(String[] args) throws IOException {
        RandomAccessFile aFile = new RandomAccessFile("d:\\ fromFile.txt", "rw");
        FileChannel fromChannel = aFile.getChannel();
 
        RandomAccessFile bFile = new RandomAccessFile("d:\\ toFile.txt", "rw");
        FileChannel toChannel = bFile.getChannel();
        long position = 0;
        long count = fromChannel.size();
        toChannel.transferFrom(fromChannel, position, count);
        aFile.close();
        bFile.close();
        System.out.println("over!");
    }
}

transferTo()示例

package test;


import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;

public class FileChannelTest3 {
    public static void main(String[] args) throws IOException {
        RandomAccessFile aFile = new RandomAccessFile("d:\\fromFile.txt", "rw");
        FileChannel fromChannel = aFile.getChannel();
   
        RandomAccessFile bFile = new RandomAccessFile("d:\\toFile.txt", "rw");
        FileChannel toChannel = bFile.getChannel();
        long position = 0;
        long count = fromChannel.size();
        fromChannel.transferTo(position, count, toChannel);
        aFile.close();
        bFile.close();
        System.out.println("over!");
    }

}

   

FileChannel示例

   

package test;


import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;


public class FileChannelTest {

 
    public static void main(String[] args) throws IOException {
        RandomAccessFile aFile = new RandomAccessFile("d:\\test.txt", "rw");
        FileChannel inChannel = aFile.getChannel();
        ByteBuffer buf = ByteBuffer.allocate(48);
        int bytesRead = inChannel.read(buf);
        while (bytesRead != -1) {
            System.out.println("Read " + bytesRead);
            buf.flip();
            while (buf.hasRemaining()) {
                System.out.print((char) buf.get());
            }


            buf.clear();
            bytesRead = inChannel.read(buf);
        }
        aFile.close();
        System.out.println("wan");
    }
}

 

Socket通道

 

常用的Socket通道

DatagramChannel:用于UDP的数据读写

SocketChannel: 用于TCP的数据读写,一般是客户端实现

ServerSocketChannel: 允许我们监听TCP连接请求,每个请求会创建会一个SocketChannel,一般是服务器实现

 

以上Channel都继承AbstractSelectableChannel,于是这三个Channel都是可以设置成非阻塞模式的。Socket通道(DatagramChannel、SocketChannel和ServerSocketChannel)在被实例化时都会创建一个对等的socket对象,即我们熟悉的java.net的类型(Socket、ServerSocket和DatagramSocket)。

 

1.非阻塞模式

   Socket通道可以在非阻塞模式下运行,跟非阻塞/阻塞相关的函数(SelecableChannel类下)

   //配置是否是阻塞模式(block为true,则为阻塞模式。block为false,则设置为非阻塞模式)

    public abstract SelectableChannel configureBlocking(boolean block)

 

    //获取当前是否是阻塞模式

     public abstract boolean isBlocking();

 

     //获取 configureBlocking和register方法同步的锁

     public abstract Object blockingLock();

 

 

 

2.ServerSocketChannel

   ServerSocketChannel用于监听TCP连接请求,常用的API如下:

public abstract class ServerSocketChannel
    extends AbstractSelectableChannel
    implements NetworkChannel
{

 //静态方法,用于创建一个新的ServerSocketChannel对象,后续还需要跟ServerSocket进行绑定操作
public static ServerSocketChannel open()

//获取关联该ServerSocketChannel的server socket
public abstract ServerSocket socket()

//当创建ServerSocketChannel对象并绑定一个ServerSocket关联的通道之后,
//调用该方法可以监听客户端的连接请求
public abstract SocketChannel accept()

//并绑定指定端口的ServerSocket,(jdk1.7以上才有)
public final ServerSocketChannel bind(SocketAddress local)

//同选择器一起使用,获取感兴趣的操作
public final int validOps()
}

    

 

静态方法open()用于创建一个新的ServerSocketChannel对象,将会返回一个未绑定的ServerSocket关联的通道。该对等ServerSocket可以通过在返回的ServerSocketChannel上调用socket()方法获取。jdk1.7以前ServerSocketChannel没有bind()方法,因此必须取出对等的socket并使用它来绑定一个端口开始监听连接

ServerSocketChannel ssc = ServerSocketChannel.open();
ServerSocket serverSocket = ssc.socket();
serverSocket.bind(new InetSocketAddress(1234));

jdk1.7以后ServerSocketChannel提供了bind()方法,所以以上可以简化为

ServerSocketChannel ssc = ServerSocketChannel.open().bind(new InetSocketAddress(1234));

 

简单的ServerSocketChannel示例:

   

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;


public class ServerSocketChannelDemo {
    public static final String GREETING = "Hello I must be going.\r\n";


    public static void main(String[] args) throws IOException, InterruptedException {
        int port = 8088;
        if (args.length > 0){
            port = Integer.parseInt(args[0]);
        }
        ByteBuffer buffer = ByteBuffer.wrap(GREETING.getBytes());
        ServerSocketChannel ssc = ServerSocketChannel.open();
        ssc.socket().bind(new InetSocketAddress(port));
        ssc.configureBlocking(false);
        while (true){
            System.out.println("Waiting for connections");
            SocketChannel sc = ssc.accept();
            if (sc == null){
                Thread.sleep(2000);
            }else {
                System.out.println("Incoming connection form:"+sc.socket().getRemoteSocketAddress());
                buffer.rewind();
                sc.write(buffer);
                sc.close();
            }
        }
    }
}

 

3. SocketChannel

SocketChannel 常见的API如下:

public abstract class SocketChannel extends AbstractSelectableChannel
 implements ByteChannel, ScatteringByteChannel, GatheringByteChannel,NetworkChannel
{

        //静态方法,打开套接字通道(创建SocketChannel实例)
        public static SocketChannel open()

        //静态方法,打开套接字通道并将其连接到远程地址
        public static SocketChannel open(SocketAddress remote)

        //返回一个操作集,标识此通道所支持的操作
        public final int validOps()

        //用于将Socket绑定到一个端口
        public abstract SocketChannel bind(SocketAddress local)

        //获取该SocketChannel关联的Socket(套接字)
        public abstract Socket socket()

        //判断是否已连接此通道的网络套接字
        public abstract boolean isConnected()

        //判断此通道上是否正在进行连接操作。
        public abstract boolean isConnectionPending()

        //用于SocketChannel连接到远程地址
        public abstract boolean connect(SocketAddress remote)

        //从通道中读取数据到缓冲区中
        public abstract int read(ByteBuffer dst)
        public abstract long read(ByteBuffer[] dsts, int offset, int length)

        //将缓冲区的数据写入到通道中
        public abstract int write(ByteBuffer src)
        public abstract long write(ByteBuffer[] srcs, int offset, int length)

}

  

创建SocketChannel对象并连接到远程地址

       SocketChannel  sc = SocketChannel.open(new InetSocketAddress(ip,port));

等价于

      SocketChannel sc = SocketChannel.open();

       sc.connect(new InetSocketAddress(ip,port));

       线程在连接建立好或超时之前都保持阻塞。

 

       示例:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;


public class SocketChannelDemo {
    public static void main(String[] args) {
        int port = 8088;
        String ip = "127.0.0.1";
        ByteBuffer readBuffer = ByteBuffer.allocate(512);

        try {
           SocketChannel socketChannel = SocketChannel.open();//创建一个socketChannel
            socketChannel.connect(new InetSocketAddress(ip,port));
            while (!socketChannel.isConnected()){
                System.out.println("connecting ...");
                Thread.sleep(1000);
            }
            System.out.println("connected");
            socketChannel.write(ByteBuffer.wrap("Hello,I am Client".getBytes()));
            while (socketChannel.read(readBuffer) > 0){
                System.out.println(readBuffer.toString());
                readBuffer.flip();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

       

 

4. DatagramChannel

       SocketChannel模拟面向连接的流协议(如TCP/IP),而DatagramChannel则面向无连接的协议(如UDP/IP)

public abstract class DatagramChannel
    extends AbstractSelectableChannel
    implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, MulticastChannel

{
       //创建DatagramChannel实例
       public static DatagramChannel open()
       public static DatagramChannel open(ProtocolFamily family)
       public final int validOps()

       //将通道的套接字绑定到本地地址
       public abstract DatagramChannel bind(SocketAddress local)

       //获取该DatagramChannel关联的DatagramSocket对象
       public abstract DatagramSocket socket()

       //是否已连接到套接字
       public abstract boolean isConnected()

       //用于DatagramChannel连接到远程地址
       public abstract DatagramChannel connect(SocketAddress remote)

       //通道此DatagramChannel接受到的数据包
       public abstract SocketAddress receive(ByteBuffer dst)

       //通过此DatagramChannel发送数据包
       public abstract int send(ByteBuffer src, SocketAddress target)

       //从此通道读取数据包
       public abstract int read(ByteBuffer dst)
       public abstract long read(ByteBuffer[] dsts, int offset, int length)

       //将数据写入到此通道
       public abstract int write(ByteBuffer src)
       public final long write(ByteBuffer[] srcs) throws IOException
}

 

打开DatagramChannel

DatagramChannel channel = DatagramChannel.open();

channel.socket().bind(new InetAddress(8088));

DatagramChannel对应的DatagramSocket如果未调用bind()绑定端口号,也是可以通讯的,因为系统默认会动态分配一个端口号

 

receive()方法,接受数据包

ByteBuffer buffer = ByteBuffer.allocate(48);
buffer.clear();
channel.receive(buffer);

send()方法,发送数据包

String newData = "New String to send,time:" +  System.currentTimeMillis();
ByteBuffer buffer = ByteBuffer.allocate(48);
buffer.clear();
buffer.put(newData.getBytes());
buffer.flip();
int bytesSent = channel.send(buffer, new InetAddress("jenkov.com", 80));

   

 

Connecting to a Specific Address

DatagramChannel是可以“连接”到网络上特定地址的。因为UDP是无连接的,所以这种“连接”不是真正像TCP那样的和远程地址建立了一个连接。不如说是它将锁定你的DatagramChannel,以便你只能向一个特定的地址发送和接收数据包。

 

连接

channel.connect(new InetAddress("jenkov.com", 80));

当“连接”建立后,你可以像使用传统的Channel一样调用read()和write()方法。只是对于发送的数据,你不会得到任何关于交付的保证。下面是一些例子:

int bytesRead = channel.read(buffer);  //读取数据

int bytesWrite = channel.write(buffer); //写数据

 

以上内容主要整理自:《Java NIO》

 

 

深深的码丨Java NIO 透析 Java 中传统的 IO 包基于流模型实现,交互方式为同步、阻塞,当发生读取或写入操作时,线程会阻塞在此,直到操作完成。编码时采用这种方式虽然源码较直观易维护,但容易产生应用性能下降问题,且 IO 效率及其拓展性存在较大局限 Java 1.4 开始引入 NIO 框架,提供了 Channel(通道)、Selector(IO复用器/选择器)、Buffer(缓冲区),可构建多路复用、同步非阻塞的 IO... 阅读详情

相关推荐

用PLECS搞定三相逆变器电流环:从传递函数推导到PI参数整定的保姆级教程

本文提供了一份详细的PLECS教程,指导如何从传递函数推导到PI参数整定,实现三相逆变器电流环的闭环控制。通过坐标变换、控制器设计和仿真验证等步骤,帮助工程师快速掌握电流环控制技术,提升电力电子系统的稳定性和可靠性。

weixin_27102543的博客 399

NIO —— Channel (通道、管道) 学习

Channel (通道、管道) A、通道(Channel) 用于源节点与目标节点的连接。在 Java NIO 中负责缓冲区中数据的传输。Channel 本身不存储数据,因此需要配合缓冲区进行传输。 B、通道的主要实现类 java.nio.channels.Channel 接口: |--FileChannel |--SocketChannel |--ServerSocketChannel |...

猎人在吃肉 1万+

MMWCAS-DSP-EVM与AWR2243实战:从开箱到数据采集的完整避坑指南

本文提供了MMWCAS-DSP-EVM与AWR2243毫米波雷达评估板从开箱、软硬件准备、固件烧录到数据采集的完整实战指南。重点解析了硬件连接、软件版本匹配、固件烧录、网络配置及MMWave Studio GUI操作等关键步骤,并汇总了常见问题排查方法,帮助开发者快速上手并规避常见陷阱。

algae的博客 504

【NIO】Channel:管道与流,及非阻塞的Channel

通道是一个对象,起到连接作用: 读/写 ==> Buffer <=> Channel <=> File 写:我们永远不会将字节直接写入通道中,相反是将数据写入包含一个或者多个字节的Buffer。 读:同样不会直接从通道中读取字节,而是将数据从通道读入Buffer,再从缓冲区获取这个字节。 在NIO 中,根据读取的file不同,提供了多种通道对象,而所有的通道对象都实现了 Channel 接口。 public interface Channel extends Closea

A minor 2418

1999年-2022年 上市公司-企业劳动生产率数据(原始数据、代码、最终结果、参考文献)

上市公司企业劳动生产率数据集为企业和市场参与者提供了一个深入分析企业生产效率和劳动效益的工具。通过这些数据,企业可以不断探索创新的发展模式和管理方式,努力提高生产效率,为提升市场竞争力和盈利能力做出贡献。数据名称:上市公司-企业劳动生产率数据数据年份:1999-2022年数据来源:国泰安数据库1999年-2022年 上市公司-企业劳动生产率数据(原始数据、代码、最终结果、参考文献)

2401_84585615的博客 882

解决AutoDock与Python版本冲突导致的内存泄漏问题:从BHtree *错误到环境配置优化

本文深入解析了AutoDock分子对接中常见的‘BHtree *’内存泄漏错误,其根源在于SWIG接口模块与Python运行环境的版本不匹配。文章提供了根治方案:通过构建Python 2.5.4与MGLTools 1.5.6的黄金兼容组合,并详细指导环境清理、安装配置及实战测试,从而彻底解决该内存泄漏问题,确保AutoDock工作流的稳定运行。

g5h6i的博客 1116

NIO学习笔记(2)--通道

通道: 既不是一个扩展也不是一项增强,而是全新、极好的Java I/O示例,提供与I/O服务的直接连接。 Channel用于在字节缓冲区和位于通道另一侧的实体(通常是一个文件或套接字)之间有效地传输数据。 通道基础:与缓冲区不同,通道API主要由接口指定。 InterruptibleChannel是一个标记接口,当被通道使用时可以标示该通道是可以中断的(In...

happysaz的博客 322

地方政府预算数据抓取:利用Python爬虫获取预算安排、资金分配与支出情况

爬虫是通过模拟浏览器行为,从互联网上自动获取数据的程序。在本案例中,我们将通过爬虫从地方政府的官方网站或预算公开平台抓取各类预算信息。这些信息一般以HTML网页的形式呈现,可以通过爬虫对网页内容进行解析,提取所需的预算数据。Python作为数据抓取的强大工具,凭借其简洁的语法、强大的第三方库(如requestsSelenium等)以及丰富的数据处理能力,成为了开发爬虫应用的首选语言。

2201_76125261的博客 943

NIO三个核心组件 ---- Channel(管道)

Channel(管道): 1.类似于流,但是区别如下: 通道可以同时进行读写,流只能读或者写 通道可以实现异步读写数据 通道可以从缓冲区(buffer)读取数据,也可以写数据到缓冲区(buffer) 2.BIO中的stream是单向的,Channel是双向的,可以读操作,也可以写操作 3 Channel在NIO中是一个接口 常用的Channel类有: FileChannel,DatagramCha...

jym的博客 1万+

Android16 动态隐藏systemUI右侧音量条

本文介绍了如何屏蔽SystemUI系统音量条并显示自定义音量控制条的实现方法。主要通过两个步骤:1)在编译脚本中定义控制属性persist.rp.show.volume.dialog=off来隐藏系统音量条;2)修改SystemUI源码中的VolumeDialogImpl.java文件,在showH方法中根据属性值判断是否显示系统音量条。当属性值为off时直接return,从而屏蔽系统音量条的显示,实现自定义音量控制条的替代显示。该方法通过系统属性控制显示状态,具有灵活可控的特点。

tzj1058756809的博客 781

当AI学会写“自传”:OpenClaw 的 SOUL.md 如何把配置文件变成一颗会变形的心

SOUL.md。

步子哥的博客 1311

Java NIO —— 管道(Channel)

管道的定义在Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为: 限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不像文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的w

司马懿的西山居 1608

软件设计师考试下午题代码部分详解:23种设计模式全面解析

软件设计师考试的下午题通常会考察设计模式的应用,这部分内容既是重点也是难点。本文将系统地介绍考试中常见的23种设计模式,通过详细代码示例和通俗易懂的讲解,帮助考生掌握这些核心知识点,提高应试能力。概念:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。适用场景:系统要独立于产品的创建、组合和表示时;系统要由多个产品系列中的一个来配置时。@Override@Override@Override@Override// 产品族A@Override。

4万+

java NIO 的通道Channel的理解

一、Channel类似于传统的“流”,只不过Channel不能直接访问数据,Channel只能与buffer交互。而且流是单向的,分为输入流和 输出流, 但是通道是双向的,通过缓冲区buffer两边都可达。Channel表示IO源与目标打开的连接。工作原理如下,通过Channel来独立处理IO请求:                                            二、主

有灯就可以编程的博客 7991

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

如何理解java channel_Java NIO 之 Channel(通道)

历史回顾:其他高赞文章:一 Channel(通道)介绍通常来说NIO中的所有IO都是从 Channel(通道) 开始的。从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。数据读取和写入操作图示:Java NIO Channel通道和流非常相似,主要有以下几点区别:通道可以读也可以写,流一般来说是单向的(只能读或者写,所以...

weixin_42521186的博客 1189

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java NIO理解(二)Channel

Channel就是一个通道,用于传输数据,两端分别是缓冲区和实体(文件或者套接字),通道的特点(也是NIO的特点):通道中的数据总是要先读到一个缓冲区,或者总是要从一个缓冲区中读入。 Channel的分类 1) FileChannel:从文件中读写数据 2) SocketChannel:通过TCP协议读写网络中的数据 3) ServerSocketChannel:在服务器...

热心网友 427

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

腾讯四面:说说你对Java NIO的通道Channel的理解

前言 Java NIO中的Channel和流类似,但不完全相同: Channel是双向的,我们既可以向Channel中写数据,也可以从Channel中读取数据。但流的读写通常是单向的。 Channel可以实现异步地读写。 Channel中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入,如下图: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kAF9dnZD-1614064332095)(https://nimg.ws.126.net/?

SQY0809的博客 319

java简单理解channel_腾讯四面:说说你对Java NIO的通道Channel的理解

前言Java NIO中的Channel和流类似,但不完全相同:Channel是双向的,我们既可以向Channel中写数据,也可以从Channel中读取数据。但流的读写通常是单向的。Channel可以实现异步地读写。Channel中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入,如下图:Channel的实现FileChannel 可以从文件中读取数据DatagramChann...

weixin_42427882的博客 467

Java NIO 三大核心(Buffer、Channel、Selector)理解

NIO 三大核心(Buffer、Channel、Selector)

在路上 1098

java channle 与流_腾讯四面:说说你对Java NIO的通道Channel的理解

前言Java NIO中的Channel和流类似,但不完全相同:Channel是双向的,我们既可以向Channel中写数据,也可以从Channel中读取数据。但流的读写通常是单向的。Channel可以实现异步地读写。Channel中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入,如下图:Channel的实现FileChannel 可以从文件中读取数据DatagramChann...

weixin_42303192的博客 341

JAVA NIO的三要素(Buffer/Channel/Selector)、四种Channel事件SelectionKey以及Netty中的零拷贝串联理解

JAVA NIO全称是Java non-blocking IO或者Java New IO。在之前的文章中(https://blog.youkuaiyun.com/weixin_42447959/article/details/107233189)提到过,NIO是IO理论思想,其中同步阻塞IO(Non-Blocking IO)演进为多路复用IO(Multiplexing IO),是IO理论思想的演进。JAVA NIO是NIO在JAVA领域的实现。 JAVA NIO的三要素,即Buffer、Channel和Selecto

白白胖胖充满希望 1306

java NIO-Channel

1 概述 之前听朋友说,他们公司有一个业务场景对于IO的操作要求较高,项目组长让他用NIO来完成这个需求,他一听一脸茫然的问组长:啥是NIO啊?项目组长听后对他挥挥手说:“起开起开,我来”。朋友后来和我分享这个事情,对于都是菜鸡的我们来说,我也不知道啥叫NIO。于是虎年伊始,我决定来学学这个NIO。以免有一天我的项目组长对我说,你起开起开,我来。 Java NIO是Java1.4之后引入的一个全新的API,它可以替代标准的IO操作,NIO既支持面向缓冲区的操作,同时也是基...

爪哇人的博客 964

【Java NIO】— NIO 基础详解

作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。

smart_an的专栏 838

Netty之三----java NIO基础

Netty 是基于Java NIO 封装的网络通讯框架,只有充分理解了 Java NIO 才能理解好Netty的底层设计。Java NIO 由三个核心组件组件: Buffer Channel Selector 一.Channel 是一个通道,它就像自来水管一样,网络数据通过 Channel 这根水管读取和写入。传统的 IO 是基于流进行操作的. 常见的channel实现类有: 1.FileChannel: 读写文本数据 public static void main(String[] args) t

qq_35529931的博客 249

java nio Channel源码分析

package java.nio.channels; import java.io.IOException; import java.io.Closeable; /** * 用于I/O操作的nexus。 * * <p> 通道表示与实体(如硬件设备、文件、网络套接字或程序组件)的开放连接, * 这些实体能够执行一个或多个不同的I/O操作,例如读或写操作。 * * <p> 通道要么是打开的,要么是关闭的。 * 通道在创建时是打开的,一旦关闭,它将保持关闭状态。 ..

今天吃了吗的博客 346
上一篇: Java NIO之Buffer详细理解
下一篇: Java NIO之Selector详细理解
思维的深度
博客等级 码龄11年 2万+粉丝 391原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值