• NIO通道的学习笔记


    个人感觉通道就像传送带一样,这边把数据包装一下里往带子上一放,另一头就收到了,在这个例子中,包装就是数据扔到Buffer中得过程,传送的载体就是Channel。

    基础

    Channel接口就俩操作isOpen()查看状态,close()关闭。

    通道分两大类,文件通道和Socket通道,后者有相关的工厂方法(open),前者只能通过RandomAccessFile,FileInputStream和FileOutputStream对象上调用getChannel方法来获取。

    通道与流的不同之处在于通道是双向的。而流只是在一个方向上移动(一个流必须是 InputStream 或者 OutputStream 的子类), 而 通道 可以用于读、写或者同时用于读写。

    通道可以以阻塞和非阻塞模式运行,非阻塞模式的通道永远不会让线程休眠。请求的操作要么立即完成要么返回一个结果表明未进行任何操作。只有面向流的通道才可以使用非阻塞模式。

    通道不能被重复利用,一个打开的通道即表明与一个特定的I/O服务的特定连接并且封装了该连接的状态。通道关闭的时候那个连接就木有了。

    通道被关闭的时候可能会被阻塞,这时候用isOpen()来查看相关状态还是蛮有必要得。

    Scatter/Gather

    Scatter从一个Channel读取的信息分散到N个Buffer中,Gather将N个Buffer里面内容按照顺序发送到一个Channel。

    这东西用好了很碉堡,用不好就…

     

    文件通道

    阻塞式的,不能置于非阻塞模式。文件通道是线程安全的,关键操作都是单线程的,一个操作在进行中,其它操作需要等待。

    使用的时候也是read和write,没啥太大区别,就是关闭的时候记得先关通道再关文件。文件通道可以加锁,不过记得在finally中释放锁。

    文件通道还有一个Channel-Channel的功能,通过调用transferTo和transferFrom来调用,但这情况下,至少一端得是FileChannel,所以甭指望俩SocketChannel互相传了,这是没戏的。

    内存映射文件

    新的FileChannel类提供了一个map()方法,该方法可以在一个打开的文件和一个特殊类型得ByteBuffer之间形成一个虚拟内存映射。通过这种机制访问文件效率非常高,有时候比用通道还快,结合文件锁来用的话简直碉堡了。map方法映射的范围不能超过文件大小,否则文件就被扩充到那么大。

    映射的模式有只读、读写和写拷贝(copy-on-write)三种,只读方式打开的文件映射读写模式就抛异常了,但是读写模式打开的文件映射只读模式是ok的。

    写拷贝模式意味着通过put()做的修改都会导致一个私有的数据拷贝并且该拷贝只能被那个MappedByteBuffer看到。该过程不会对底层文件做出修改。虽然不会修改文件内容,但是用这映射模式时,文件仍然必需以读写权限打开。

    Socket通道

    自打有了这玩意儿,就不需要每个socket使用一个线程了,而且它可以置为非阻塞模式。

    然后就是ServerSocketChannel(包装了ServerSocket的Channel),同理SocketChannel和DatagramChannel也是一样

    管道

    java.nio.channels包中含有一个名为Pipe(管道)的类,广义上讲,管道就是一个用来在两个实体之间单向传输数据的导管,管道通常被用来连接一个进程的输出和另一个进程的输入。Pipe类实现一个管道范例,不过它所创建的管道是进程内(在Java虚拟机进程内部)而非进程间使用的。

    管道由一对通道组成:一个可写入的 sink 通道和一个可读取的 source 通道。一旦将某些字节写入接收器通道,就可以按照与写入时完全相同的顺序从源通道中读取这些字节。

  • 相关阅读:
    大型网站技术架构:核心原理与案例分析笔记
    Springmvc 中org.springframework.http.converter.json.MappingJackson2HttpMessageConverter依赖jackson包
    idea 打开自动编译以及查看Problem窗口
    idea出现Error:Maven Resources Compiler: Maven project configuration required for module 'market' isn't available.
    Git常用命令
    mysql explain用法
    mysql中insert into select from的使用
    SpringMVC使用@PathVariable,@RequestBody,@ResponseBody,@RequestParam,@InitBinder
    git创建仓库
    context:component-scan扫描使用的use-default-filters
  • 原文地址:https://www.cnblogs.com/Cratical/p/2650664.html
Copyright © 2020-2023  润新知