Java NIO介绍

news/2024/9/6 20:13:32 标签: nio

发展史

按照使用的 IO 模型,大致可以分为三类:

  • BIO:JDK1.4 之前的阻塞 IO
  • NIO:JDK1.4 及以后的版本,非阻塞 IO
  • AIO:JDK1.7 之后,又叫 NIO.2,异步 IO

IO 总的来说分为两个阶段,第一阶段是等待数据到达内核缓冲区,第二阶段是将数据从内核缓冲区复制到用户缓冲区。

Java NIO

Java NIO 是 java 1.4, 之后新出的一套IO接口NIO中的N可以理解为Non-blocking,不单纯是New。

NIO的特性/NIO与IO区别

1)IO是面向流的,NIO是面向缓冲区的;
2)IO流是阻塞的,NIO流是不阻塞的;
3)NIO有选择器,而IO没有。

读数据和写数据方式

  • 从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。

  • 从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。

NIO核心组件简单介绍

Java NIO的三大核心组件是Channel(通道)、Buffer(缓冲区)、Selector(选择器)。其中,通道和缓冲区的联系比较密切:数据总是从通道读到缓冲区内,或者从缓冲区写入通道中。

Java NIO里关键的Buffer实现

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

例子

package com.sto.nio;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @author yanyugang
 * @description
 * 实例说明:实现文件复制功能
 * 实现方式:通道FileChannel、 缓冲区ByteBuffer
 * @date 2019-09-12 15:15
 */
public class NioTest {
    public static void main(String[] args) throws IOException{
        // 设置输入源 & 输出地 = 文件
        String infile="d:/knowledge.txt";
        String outfile="d:/hello.txt";

        // 1. 获取数据源 和 目标传输地的输入输出流(此处以数据源 = 文件为例)
        FileInputStream fin=new FileInputStream(infile);
        FileOutputStream fout=new FileOutputStream(outfile);

        // 2. 获取数据源的输入输出通道
        FileChannel fcin=fin.getChannel();
        FileChannel fcout=fout.getChannel();

        // 3. 创建缓冲区对象
        ByteBuffer buff=ByteBuffer.allocate(1024);

        while (true) {
            // 4. 从通道读取数据 & 写入到缓冲区
            // 注:若 以读取到该通道数据的末尾,则返回-1
            int r=fcin.read(buff);
            if (r==-1){
                break;
            }
            // 5. 传出数据准备:调用flip()方法
            buff.flip();

            // 6. 从 Buffer 中读取数据 & 传出数据到通道
            fcout.write(buff);

            // 7. 重置缓冲区
            buff.clear();
        }
    }
}

http://www.niftyadmin.cn/n/1364163.html

相关文章

21个jQuery经典特效0积分下载

http://download.csdn.net/album/detail/387转载于:https://www.cnblogs.com/yukino/p/3930799.html

DefaultListableBeanFactory源码

DefaultListableBeanFactory是接口ConfigurableListableBeanFactory和BeanDefinitionRegistry的默认实现,是Spring容器中默认的对象工厂的实现,是一个比较全面的对象工厂。 注册过程中,最核心的一句就是:this.beanDefinitionMap.p…

使用类名创建对象

根据函数名调用方法 如&#xff1a; call_user_func <?php error_reporting(E_ALL); function increment(&$var) {$var; }$a 0; call_user_func(increment, $a); echo $a."\n";call_user_func_array(increment, array(&$a)); // You can use this inste…

Nginx服务器命令

安装 Nginx Linux——yum安装nginx 1.17 删除nginx yum remove nginxNginx介绍 Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。 在高并发连接的情况下&#xff0c;Ngin…

No result defined for action and result input的错误

这个错误就是说没有为返回的input定义&#xff0c;可是有时候我们不一定要这个鬼东西&#xff0c;然而在Action中出错的话&#xff0c;默认就返回了这个input了&#xff0c;这时&#xff0c;我 们在struts的<result>中定义的话&#xff0c;就出现No result defined for a…

Java集合-List源码

介绍 List继承自Collection的接口&#xff0c;是一个有序集合&#xff0c;我们可以精确控制在何处插入元素&#xff1b;可以根据下标获取和查找指定元素&#xff1b;List允许插入重复元素&#xff0c;允许插入多个null元素。List继承自Collection的接口&#xff0c;List也是集合…

C#操作Word (2)-- 打开关闭Word文档

本文正式开始在VS2010中使用C#语言操作Word2007. 不是十分了解Word对象模型的朋友&#xff0c;请参考上一篇文章&#xff0c;或者下载&#xff1a;C#操作Word2007.pdf。 ----------------------------------华丽分割-------------------------------------------- 1.添加Refere…

BeanDefinition源码

介绍 BeanDefinition&#xff0c;顾名思义&#xff0c;是一个对象(Bean)在Spring中描述 BeanDefinition 中保存了我们的 Bean 信息&#xff0c;比如这个 Bean 指向的是哪个类、是否是单例的、是否懒加载、这个 Bean 依赖了哪些 Bean 等等。 Spring 通过定义 BeanDefinition 来管…