Java-NIO(2)

Java NIO.2总结 目录 NIO.2概述 文件系统 文件路径 文件及目录 文件元数据 文件、目录校验 创建、删除、复制、移动 文件、目录读写 新旧File API比较 参考文献 NIO.2概述 NIO.2在JDK1.7中发布,针对原有的文件IO操作进行了优化及封装,并支持Asynchronous IO。从Java IO详细总结(源码解析)、Java NIO详细总结(源码解析)这两篇文... 阅读详情

Java-NIO(2)

缓冲区

常规I/O操作存在很大缺点,主要是因为它们是阻塞的,而NIO正是为了解决常规I/O执行效率低的问题,采用非阻塞高性能运行的方式来避免出现笨拙的同步I/O带来的效率低的问题

缓冲区Buffer,在NIO的使用中地位很高,因为数据就是放到缓冲区,对数据进行处理的

NIO中的Buffer是一个用于存储基本数据类型的容器,它以类似于数组有序的方式来存储和组织数据,每个基本数据类型(除boolean)都有一个子类相对应

Buffer类

Buffer类及其子类都是抽象类,不能直接实例化,使用方式是将对应的数据类型的数组包装进入缓冲区,借助静态方法wrap实现

API

NIO缓冲区中,有四个重要的参数:

  • capacity-容量

  • limit-限制

  • position-位置

  • mark-标记

四个之间的大小关系


0 <= mark <= position <= limit <= capacity

capacity

代码包含元素的数量。值不能为负数,且不可更改

方法:



/**
* Returns this buffer's capacity.
*
* @return  The capacity of this buffer
*/
public final int capacity() {
return capacity;
}


public class T1 {


    public static void main(String[] args) {

        byte[] bytes = new byte[]{1,2,3};

        short[] shorts = new short[]{1,2,3,4};

        int[] ints = new int[]{1,2,3,4,5};

        long[] longs = new long[]{1,2,3,4,5,6};

        float[] floats = new float[]{1,2,3,4,5,6,7};

        double[] doubles = new double[]{1,2,3,4,5,6,7,8};

        char[] chars = new char[]{'a','b','c','d','e'};

        ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);

        ShortBuffer shortBuffer = ShortBuffer.wrap(shorts);

        IntBuffer intBuffer = IntBuffer.wrap(ints);

        LongBuffer longBuffer = LongBuffer.wrap(longs);

        FloatBuffer floatBuffer = FloatBuffer.wrap(floats);

        DoubleBuffer doubleBuffer = DoubleBuffer.wrap(doubles);

        CharBuffer charBuffer = CharBuffer.wrap(chars);

        print(byteBuffer);

        print(shortBuffer);

        print(intBuffer);

        print(longBuffer);

        print(floatBuffer);

        print(doubleBuffer);

        print(charBuffer);

    }

    private static void print(Buffer buffer) {

        System.out.println("Name : \n");

        System.out.println(buffer.getClass().getName() + "\n");

        System.out.println("Capacity : \n");

        System.out.println(buffer.capacity());

        System.out.println("----------------------------------");

    }

}


看下ByteBuffer中wrap方法:



//将字节数组包装到缓冲区中。
//新缓冲区将由给定的字节数组支持; 也就是说,对缓冲区的修改将导致数组被修改,反之亦然。 新缓冲区的容量和限制将为array.length,其位置为零,其标记为未定义,其字节顺序为BIG_ENDIAN。 它的支持数组将是给定的数组,其数组偏移量将为零。
public static ByteBuffer wrap(byte[] array) {
return wrap(array, 0, array.length);
}


limit

何为限制?缓冲区的限制代表了第一个不应该读取或者写入元素的index(索引),limit不可以为负,且不可以大于capacity,假设position大于limit,那么将position设置为新的limit,假设mark已定义且大于新的limit,则丢弃mark

limit应用图示:

图1.png

测试:


public class T2 {

    public static void main(String[] args) {

        char[] chars = new char[]{'a','b','c','d','e'};

        CharBuffer charBuffer = CharBuffer.wrap(chars);

        System.out.println("capacity : \n");

        System.out.println(charBuffer.capacity());

        System.out.println("");

        System.out.println("Limit : \n");

        System.out.println(charBuffer.limit());

        System.out.println("");

        charBuffer.limit(3);

        System.out.println("设置调整之后 : \n");

        System.out.println("capacity : \n");

        System.out.println(charBuffer.capacity());

        System.out.println("");

        System.out.println("Limit : \n");

        System.out.println(charBuffer.limit());

        System.out.println("");

        charBuffer.put(0,'0');

        charBuffer.put(1,'1');

        charBuffer.put(2,'2');

        charBuffer.put(3,'3');//报错

        charBuffer.put(4,'4');

        charBuffer.put(5,'5');

        charBuffer.put(6,'6');
        
    }
}

Limit使用场景就是当反复向缓冲区存取数据时使用,如下图,第一次向缓冲区存储9个数据,然后读取全部9个数据,完成之后再进行第二次向缓冲区存储数据,第二次只存4个数据:

图2.png

当读取会出现问题,如果读取全部1 2 3 4 E F G H I是错误的,所以要结合limit限制读取的范围,在E设置Limit,实现读取1 2 3 4这4个正确的数据

position

何为位置?它代表下一个要读取或写入元素的index,不能为负,且不能大于limit

图示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZShlpodq-1586246156751)(https://upload-images.jianshu.io/upload_images/5653258-449c865aa0d5838e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

position对应index为3,说明从此位置开始写入或者读取,直到limit结束


public class T3 {


    public static void main(String[] args) {

        char[] chars = new char[]{'a','b','c','d','e'};

        CharBuffer charBuffer = CharBuffer.wrap(chars);

        print(charBuffer);

        System.out.println("-----------");

        charBuffer.position(2);

        print(charBuffer);

        System.out.println("-----------");

        charBuffer.put('1');

        for (int i = 0; i < chars.length; i++) {
            System.out.println(chars[i] + "   ");
        }
    }

    private static void print(Buffer buffer) {

        System.out.println("Capacity : " + buffer.capacity()

        +"   " + "limit :  " + buffer.limit() + "   "
        + "position : " + buffer.position());

    }
}


remaining

方法remaining作用:返回当前位置与limit之间的元素个数

图示:

图4.png

源码:



/**
* Returns the number of elements between the current position and the
* limit.
*
* @return  The number of elements remaining in this buffer
*/
public final int remaining() {
return limit - position;
}


public class T4 {

    public static void main(String[] args) {
        char[] chars = new char[]{'a','b','c','d','e'};

        CharBuffer charBuffer = CharBuffer.wrap(chars);

        print(charBuffer);

        System.out.println("-----------");

        charBuffer.position(2);

        print(charBuffer);

        System.out.println("-----------");

        System.out.println("remaining   " + charBuffer.remaining());

    }

    private static void print(Buffer buffer) {

        System.out.println("Capacity : " + buffer.capacity()

                +"   " + "limit :  " + buffer.limit() + "   "
                + "position : " + buffer.position());

    }
}

mark()

缓冲区位置设置标记

标记作用:缓冲区的标记是一个索引,在调用reset方法时,会将缓冲区的position位置重置为该索引

缓冲区的mark类似于爬山时在关键路口设置路标,为了在原路返回时找到回去的路



public class T6 {

    public static void main(String[] args) {


        char[] chars = new char[]{'a','b','c','d','e'};

        CharBuffer charBuffer = CharBuffer.wrap(chars);

        System.out.println("capacity        " + charBuffer.capacity());

        charBuffer.position(1);

        charBuffer.mark(); // 位置1设置标记

        System.out.println("position        " + charBuffer.position());

        System.out.println("-----------");


        charBuffer.position(2);

        System.out.println("position        " + charBuffer.position());


        charBuffer.reset();

        System.out.println("---------");

        System.out.println("reset \n");
        System.out.println("position        " + charBuffer.position());


    }
}
判断只读

public class T7 {

    public static void main(String[] args) {

        byte[] bytes = new byte[]{1,2,3};

        short[] shorts = new short[]{1,2,3,4};

        int[] ints = new int[]{1,2,3,4,5};

        long[] longs = new long[]{1,2,3,4,5,6};

        float[] floats = new float[]{1,2,3,4,5,6,7};

        double[] doubles = new double[]{1,2,3,4,5,6,7,8};

        char[] chars = new char[]{'a','b','c','d','e'};

        ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);

        ShortBuffer shortBuffer = ShortBuffer.wrap(shorts);

        IntBuffer intBuffer = IntBuffer.wrap(ints);

        LongBuffer longBuffer = LongBuffer.wrap(longs);

        FloatBuffer floatBuffer = FloatBuffer.wrap(floats);

        DoubleBuffer doubleBuffer = DoubleBuffer.wrap(doubles);

        CharBuffer charBuffer = CharBuffer.wrap(chars);

        print(byteBuffer);
        print(shortBuffer);
        print(intBuffer);
        print(longBuffer);
        print(floatBuffer);
        print(doubleBuffer);
        print(charBuffer);
    }

    private static void print(Buffer buffer) {
        System.out.println("is readOnly ? : \n" +
                buffer.isReadOnly());
    }
}


直接缓冲区

何为直接与非直接缓冲区?

图示:

图6.png

使用非直接缓冲区存取数据,需要将数据暂存在JVM的中间缓冲区,如果有频繁的数据操作,则会大大降低软件对于数据的吞吐量,效率低下,所以就使用直接缓冲区来解决这个问题


public class T8 {

    public static void main(String[] args) {

        ByteBuffer byteBuffer = ByteBuffer.allocate(100);

        System.out.println(byteBuffer.isDirect());

        ByteBuffer byteBuffer1 = ByteBuffer.allocateDirect(100);

        System.out.println(byteBuffer1.isDirect());

    }
}

还原缓冲区状态

final Buffer clear():

还原缓冲区到初始状态:

  • 位置设为0

  • 限制设为容量

  • 丢弃标记

源码实现:


public final Buffer clear() {
        position = 0;
        limit = capacity;
        mark = -1;
        return this;
    }

此方法使用场景就是在对缓存区存储数据之前调用此方法,如:


buf.clear();

in.read(buf);

但clear方法不是真正的清除缓存区中的数据,它的清除是通过将position位置归0,再执行写入新数据的代码,将最新数据由索引位置0开始进行覆盖,新值覆盖旧值,间接的清除数据


public class T9 {


    public static void main(String[] args) {

        byte[] bytes = new byte[]{1,2,3,4,5,6,7};

        ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);

        byteBuffer.position(2);
        byteBuffer.limit(3);
        byteBuffer.mark();

        byteBuffer.clear();

        System.out.println("position: \n" + byteBuffer.position());

        System.out.println("");

        System.out.println("limit : \n" + byteBuffer.limit());

        System.out.println("");
        
    }
}


缓冲区反转

源码:



public final Buffer flip() {
    limit = position;
    position = 0;
    mark = -1;
    return this;
}

效果:

  • 限制设为当前位置

  • 位置设为0

  • 如果定义了标记就丢弃

当向缓冲区存储数据,然后再从缓冲区读取数据时,就是使用flip方法的好地方:



A : buf.allocate(10);

B : buf.put(8);

C : 先向buf写入数据

D : buf.flip();

E : 再从buf读数据


图示:
图6.png




public class T2 {

    public static void main(String[] args) {

        CharBuffer charBuffer = CharBuffer.allocate(20);

        print(charBuffer);

        charBuffer.put(" I am from China");

        System.out.println("-----------------------------");
        print(charBuffer);
        System.out.println("-----------------------------");
        charBuffer.position(0);
        print(charBuffer);
        System.out.println("-----------------------------");

        // 以下循环多输出了6个空格 为无效的数据
        // 正确的应该是只打印前面有效的字符 空格不在输出
        for (int i = 0; i < charBuffer.limit(); i++) {
            System.out.println(charBuffer.get());
        }

        /*
        上面为错误的读取数据示例
         */
        System.out.println("-----------------------------");

        print(charBuffer);
        System.out.println("-----------------------------");

        // 还原缓冲区状态
        charBuffer.clear();

        print(charBuffer);
        System.out.println("-----------------------------");

        charBuffer.put(" I ams usa");

        print(charBuffer);
        System.out.println("-----------------------------");

        /*
        以下操作是自己手动实现了 flip方法的逻辑
         */
        charBuffer.limit(charBuffer.position());

        charBuffer.position(0);

        print(charBuffer);
        System.out.println("-----------------------------");

        for (int i = 0; i < charBuffer.limit(); i++) {
            System.out.println(charBuffer.get());
        }

    }

    private static void print(Buffer buffer){
        System.out.println("position : \n"
        + buffer.position()
        +"\n"
        +"limit : \n"
        +buffer.limit());
    }
}


判断是否有底层实现的数组

源码:


public final boolean hasArray() {
    return (hb != null) && !isReadOnly;
}


public class T3 {

    public static void main(String[] args) {

        ByteBuffer byteBuffer = ByteBuffer.allocate(100);

        byteBuffer.put((byte) 1);
        byteBuffer.put((byte) 2);

        System.out.println(byteBuffer.hasArray());

        /* 对直接缓冲区判断 */

        ByteBuffer dircet_byteBuffer = ByteBuffer.allocateDirect(100);
        dircet_byteBuffer.put((byte) 1);
        dircet_byteBuffer.put((byte) 2);
        System.out.println(dircet_byteBuffer.hasArray());

    }
}


  • 打印true是因为使用了byte[] hb存储数据,所以hb[]对象为非空,结果就是true

  • 打印false是因为代表byte[] hb数组为null,数据直接存在内存了

判断当前位置与限制之间是否还有剩余元素

源码:


  public final boolean hasRemaining() {
        return position < limit;
    }

以及返回当前位置与限制之间的元素个数:


    public final int remaining() {
        return limit - position;
    }


    public static void main(String[] args) {

        byte[] bytes = new byte[]{1,2,3,4,5};

        ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);

        byteBuffer.limit(3);

        byteBuffer.position(2);

        System.out.println("hasRemainging : \n"
        +byteBuffer.hasRemaining()
        +"Remainging : \n"
        +byteBuffer.remaining());


    }

重绕缓冲区

源码实现:

    public final Buffer rewind() {
        position = 0;
        mark = -1;
        return this;
    }

在一系列通道重新写入或获取的操作之前调用此方法:

     
out.write(buf);    // Write remaining data
buf.rewind();      // Rewind buffer
buf.get(array);    // Copy data into array</pre></blockquote>

rewind():标记清除,位置position归0,limit不变

rewind经常在重新读取缓冲区数据时使用

而clear()方法主要使用场景是在对缓冲区进行存储数据之前调用

flip()是缩小limit范围

三者侧重点不同:

  • rewind:侧重于在“重新”,在重新读取,重新写入时使用

  • clear():侧重于还原一切状态

  • flip():侧重于substring截取


public class T5 {

    public static void main(String[] args) {

        byte[] bytes = new byte[]{1,2,3,4,5,6,7,8};

        ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);

        print(byteBuffer);

        System.out.println("");

        byteBuffer.position(1);
        byteBuffer.limit(3);
        byteBuffer.mark();

        print(byteBuffer);

        System.out.println("");

        byteBuffer.rewind();

        print(byteBuffer);

        byteBuffer.reset();


    }
    private static void print(Buffer buffer){
        System.out.println("capacity : \n"
                + buffer.capacity()
                +"\n"
                +"limit : \n"
                +buffer.limit()
        +"\n"
        +"position : \n"
        + buffer.position());
    }
}

List.toArray(T[])转出数组类型

public class T6 {

    public static void main(String[] args) {

        ByteBuffer b1 = ByteBuffer.wrap(new byte[]{'1','2','3'});
        ByteBuffer b2 = ByteBuffer.wrap(new byte[]{'1','2','3'});
        ByteBuffer b3 = ByteBuffer.wrap(new byte[]{'1','2','3'});
        ByteBuffer b4 = ByteBuffer.wrap(new byte[]{'1','2','3'});
        ByteBuffer b5 = ByteBuffer.wrap(new byte[]{'1','2','3'});

        List<ByteBuffer> list = new ArrayList<>();
        list.add(b1);
        list.add(b2);
        list.add(b3);
        list.add(b4);
        list.add(b5);

        ByteBuffer[] byteBuffers = new ByteBuffer[list.size()];
        list.toArray(byteBuffers);

        System.out.println("--------------------------");

        
        System.out.println(byteBuffers.length);

        for (int i = 0; i < byteBuffers.length; i++) {

            ByteBuffer byteBuffer = byteBuffers[i];

            while (byteBuffer.hasRemaining()) {

                System.out.println((char)byteBuffer.get());

            }

            System.out.println("--------------------------");

        }



    }
}


参考资料

《NIO与Socket编程技术指南》

Java NIO2详解:异步文件和网络编程 一、NIO2 简介 从NIO到NIO2: 发展历程及优势 异步IO模型: 原理和优势 核心组件: AsynchronousChannel, CompletionHandler, AsynchronousFileChannel, AsynchronousSocketChannel/AsynchronousServerSocketChannel 二、异步文件编程 AsynchronousFileChannel: 打开、读取、写入文件 CompletionHandler: 处理异步操作结果 阅读详情

相关推荐

Java NIO 最新进展:JDK 17中NIO2的新特性解析

本文聚焦JDK 17中NIO2(即Java NIO第二版)的核心更新,覆盖Unix域套接字支持文件系统API增强异步通道优化三大方向。适合希望提升Java IO编程效率、理解最新NIO技术趋势的开发者阅读。先通过“快递运输”类比理解NIO/NIO2的核心概念;重点讲解JDK 17中NIO2的3大新特性(附代码示例);提供“同一主机进程通信”“大文件异步读写”等实战案例;总结新特性的价值与未来趋势。NIO。

Java大师兄的博客 1171

Java语言进阶:NIO2-AIO(异步、非阻塞)

Java语言进阶:NIO2-AIO(异步、非阻塞) AIO概述 在 Java 7 中,NIO 有了进一步的改进,也就是 NIO 2,引入了异步非阻塞 IO 方式,也有很多人叫它 AIO(Asynchronous IO)。 同步,异步,阻塞,非阻塞概念回顾 同步:调用方法之后,必须要得到一个返回值。 异步:调用方法之后,没有返回值,但是会有回调函数。回调函数指的是满足条件之后会自动执行的方法 阻塞:如果没有达到方法的目的,就一直停在这里【等待】。 非阻塞:不管有没有达到目的,都直接【往下执

weixin_48351326的博客 2049

关于使用vcpkg下载osgearth遇到的问题

注意--x-manifest-root=后面跟着的E:\gitproject\osgearth-osgearth-3.5\vcpkg是你下载的源码解压缩后vcpkg.json的文件地址,然后等待编译完成。安装vcpkg后使用vcpkg install osgearth:x64-windows安装好osgearth并且导入项目使用时,发现无法运行官方文档中示例的main.cpp。这里写一种自己用过的使用vcpkg安装osgearth3.5的方法,源码,打开vcpkg所在的命令行,执行。示例main.cpp。

m0_61776040的博客 1523

NIO & NIO2

NIO && NIO2

qq_37824570的博客 789

String+CytoScape构建PPI网络

1.下载CytoScape Cytoscape是一款专业强大好用的物生信息分析软件,主要达用于专业的研究人员使用,软件主要适用于整合模块化网络和生物科学联系网络图的绘制,支持多种文件格式,导入后就可以直接进行编辑或者分析等操作了,除此之外,软件还提供了强大的编辑工具,支持添加相应的注释信息,软件基于java环境组件打造。 下载地址:https://cytoscape.org/ 因为软件基于java...

xiaobai1_1的博客 1万+

WSL中使用VMD图形化界面

【代码】WSL中使用VMD图形化界面。

handsome213的博客 838

IO NIO NIO2(AIO) 概述

一、概述 在我们学习Java的IO流之前,我们都要了解几个关键词 同步与异步(synchronous/asynchronous):同步是一种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调用返回,才会进行下一步;而异步则相反,其他任务不需要等待当前调用返回,通常依靠事件、回调等机制来实现任务间次序关系 阻塞与非阻塞:在进行阻塞操作时,当前线程会处于阻塞状态,无法从事其他任务,...

krismile__qh的博客 4071

Windows server 2012R2安装Oracle11g

打开 开始——所有程序——Oracle-OraDb11g_home1——配置和移植工具——Database Configuration Assistant。打开 开始——所有程序——Oracle-OraDb11g_home1——配置和移植工具——Net Configuration Assistant。首先打开Oracle的安装位置找到下面的位置找到tnsnames.ora文件右键编辑。打开Oracle的安装位置找到下面的位置找到tnsnames.ora文件右键编辑。选择仅安装数据库软件。

qq_74770105的博客 3595

Java NIO、NIO.2学习笔记

相关学习资料 http://www.molotang.com/articles/903.html http://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html 目录 1. NIO、NIO.2简介 2. NIO中的关键技术 1. NIO、NIO.2简介 Java中的输入流、输出流都是阻塞式的输入、输出。不仅如此...

liyongshun82的博客 802

利用Python爬虫获取淘宝商品评论:实战案例分析

在数字化时代,数据的价值日益凸显,尤其是对于电商平台而言,商品评论作为用户反馈的重要载体,蕴含着丰富的信息。本文将详细介绍如何利用Python爬虫技术获取淘宝商品评论,包括代码示例和关键步骤解析。

2401_87849335的博客 2833

【WRF数据介绍第二期】气象驱动场数据介绍及下载

【WRF数据介绍第二期】气象驱动场数据介绍及下载

WW、forever的博客 2160

java nio 2_Java IO & NIO & NIO2

概览IO是Java中的最重要的一个部分. 其中, java.io是所有编程者都应该掌握的IO方式. 在Java 1.4中, NIO被引入, 它引进了一种新的相对于流模型的新的IO模型, 以为非阻塞IO提供支持. 在Java 7中, NIO2又在NIO的基础上, 引入了对异步IO的支持. 在这篇文章我, 我将对这几种IO方式进行一个比较系统的说明及总结, 同时, 分析每一种IO模型的适用范围.流IO...

weixin_31966615的博客 376

(计算机组成原理)第二章数据的表示和运算-第二节:数字电路基础知识

本文介绍了计算机组成原理中的逻辑门电路、多路选择器和三态门。逻辑门电路包括基本逻辑运算(与、或、非)和复合逻辑运算(与非、或非、异或、同或),这些运算通过门电路实现,并满足分配律和结合律。多路选择器(MUX)用于从多个输入信号中选择一个输出,广泛应用于数据选择、资源共享和逻辑函数实现等场景。三态门则具有三种输出状态(高电平、低电平、高阻态),常用于总线控制和信号隔离。这些元件在数字电路设计和计算机系统中具有重要作用。

快乐江湖的博客 2472

java nio nio2 区别_Java NIO2:NIO概述

一、概述从JDK1.4开始,Java提供了一系列改进的输入/输出处理的新特性,被统称为NIO(即New I/O)。新增了许多用于处理输入输出的类,这些类都被放在java.nio包及子包下,并且对原java.io包中的很多类进行改写,新增了满足NIO的功能。NIO采用内存映射文件的方式来处理输入输出,NIO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样访问文件了。NIO 与原来的 I/...

weixin_28695161的博客 1122

Codex 接入国产大模型指南:客户端与 CLI 双端实战

CC Switch是目前最流行的 Codex / Claude Code 模型切换工具,内置了协议转换功能,支持几乎所有主流国产模型。核心原理Codex → 本地 8317 端口(CC Switch)→ 协议转换 → 国产模型 API整个过程对 Codex 完全透明,Codex 以为自己在跟标准的 Responses API 对话。用户类型推荐方案理由新手 / 不想折腾配置简单,免费额度够用追求稳定体验通义千问(原生接入)官方兼容,功能最完整企业用户自建 AI 网关可控性强,支持多用户管理预算有限。

篮球界最会写bug的人;程序猿中打球最菜的人。 571

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

java nio2 nio_5种调优Java NIO和NIO.2的方式

Java NIO(New Input/Output)——新的输入/输出API包——是2002年引入到J2SE 1.4里的。Java NIO的目标是提高Java平台上的I/O密集型任务的性能。过了十年,很多Java开发者还是不知道怎么充分利用NIO,更少的人知道在Java SE 7里引入了更新的输入/输出 API(NIO.2)。这篇教程展示了5个在Java编程的一些常见场景里使用NIO和NIO.2包...

weixin_30591519的博客 272

蓝牙模块HM-10手册

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

Java NIO.2

Java NIO.2NIO.2Path, Paths, FilesFileVisitorWatchService文件属性 NIO.2 Java7 对NIO进行了改进: 新增java.nio.file 包,提供全面的文件IO和文件系统访问; 基于异步Channel的IO,在java.nio.channels下增加 Asynchronous开头的Channel接口和类。 Path, Paths, ...

yonggang7的专栏 746

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java nio2 nio_JSR 203规范和JAVA NIO 2.0 究竟是什么?(JAVA NIO2系列之一)

java的NIO大行其道,其高效的处理机制利用了目前linux和Windows中的IO多路复用技术,目前已经在各个web服务器中,如tomcat,jetty作为主要通道提供服务,而很多的网络框架如Netty,Mina等也利用NIO的API进行编程;不过JAVA 6的NIO框架有很多的不太完善的地方 a.JDK的NIO框架的有很多著名的bug,如epoll空转的bug,很多bug到很久之后才被修复,...

weixin_35468857的博客 355

Java NIO2介绍

Java NIO2介绍

zhangbinalan的专栏 786

java nio2

java nio2

陈罗杰的专栏 538

5种调优Java NIO和NIO.2的方式

5种调优Java NIO和NIO.2的方式  Java NIO(New Input/Output)——新的输入/输出API包——是2002年引入到J2SE 1.4里的。Java NIO的目标是提高Java平台上的I/O密集型任务的性能。过了十年,很多Java开发者还是不知道怎么充分利用NIO,更少的人知道在Java SE 7里引入了更新的输入/输出 API(NIO.2)。这篇教程展示

950

Java IO & NIO & NIO2

概览 IO是Java中的最重要的一个部分. 其中, java.io是所有编程者都应该掌握的IO方式. 在Java 1.4中, NIO被引入, 它引进了一种新的相对于流模型的新的IO模型, 以为非阻塞IO提供支持. 在Java 7中, NIO2又在NIO的基础上, 引入了对异步IO的支持. 在这篇文章我, 我将对这几种IO方式进行一个比较系统的说明及总结, 同时, 分析每一种IO模型的适用范围. ...

wang123459的博客 1116

介绍 Java NIO2 File API

介绍 Java NIO2 File API 本文我们聚焦java new io api —— NIO的基础文件操作。Java NIO2 File API 是java 7 引入的主要新特性之一,尤其和Path api一起组成了新的文件系统API. 环境及约定 如果需要使用nio,需要导入包: import java.nio.file.*; 因为本文示例代码可能运行在不同环境,所以我们针对用户目录进...

neweastsun的专栏 1102

Java IO/NIO, IO、NIO、NIO2

为什么80%的码农都做不了架构师?>>> ...

weixin_33805743的博客 191

Java学习笔记-第十四章-NIO与NIO2

目录一、NIO二、NIO21. NIO2架构2. 操作路径3. 未完待续 一、NIO /** * 原始的dump * * @param inputStream * @param outputStream */ public static void dump(InputStream inputStream, OutputStream outp...

localhost 1166
上一篇: Java-NIO(1)
下一篇: Java-NIO(3)
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值