Java-NIO详解-(1)通道(Channel)与缓冲区(Buffer)

netty源码分析(一)——ChannelBuffer netty源码分析持续更新文章,建议先关注收藏哦~以免下次不好找 netty源码分析之ChannelBuffer netty源码分析之Channel接口 netty源码分析之ServerChannel netty源码分析之ChannelConfig netty源码分析之ChannelEvent netty源码分析之ChannelSink netty源码分析之ChannelHandler netty源码分析之ChannelPipeline netty源码分析之ChannelFuture n 阅读详情

1.Java NIO简介

Java NIO(New IO)是从Java1.4版本开始引入的一个新的IO API,可以代替标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。

2.Java NIO与IO的主要区别

IONIO
面向流(Stream Oriented)面向缓冲区(Buffer Oriented)
阻塞IO(Blocking IO)非阻塞IO(No Blocking IO)
无选择器(Selectors)

3.通道(Channel)与缓冲区(Buffer)

3.1通道和缓冲区简介

Java NIO系统的核心在于:通道(Channel)和缓冲区(Buffer)。通道表示打开到IO设备(例如:文件、套接字)的连接。若需要使用NIO系统,需要获取用于连接IO设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,对数据进行处理。

3.2缓冲区(Buffer)

(1)缓冲区一个用于特定基本数据类型的容器。有Java.nio报定义的,所有缓冲区都是Buffer抽象类的子类。

(2)Java NIo中的Buffer主要用于与NIO通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道中。

(3)Buffer就像一个数组,可以保存多个相同类型的数据。根据数据类型不同(boolean除外),有以下Buffer常用子类:
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
上述Buffer类他们都采用相识的方法进行管理数据,只是各自管理的数据类型不同而已。都是通过如下方法获取一个Buffer对象:
public static XXXBuffer allocate(int capacity):创建一个容量为capcaity的Buffer对象

3.3缓冲区的基本属性

3.3.1Buffer中的重要概念

(1)容量(capacity):表示Buffer最大容量,缓冲区容量不能为负,并且创建不能更改

(2)限制(limt):第一个不应该读取或写入的数据的索引,即位于limit后的数据不可读写。缓冲区的限制不能为负,并且不能大于其容量。

(3)位置(position):下一个要读取或写入的数据的索引。缓冲区的位置不能为负,并且其不能大于其限制。

(4)标记(mark)与重置(reset):标记是一个索引,通过Buffer中的mark()方法指定Buffer中一个特定的position,之后可以通过调用reset()方法恢复到这个position。

(5)标记、位置、限制、容量遵守以下不变式:0<=mark<=position<=limit<=capacity
在这里插入图片描述
3.4Buffer常用的方法

方法描述
Buffer clear()清空缓冲区并返回对缓冲区的引用
Buffer flip()将缓冲区的界限设置为当前位置,并将当前位置充值为0
int capacity()返回Buffer的capacity大小
boolean hashRemaining()判断缓冲区中是否还有元素
int limit()返回Buffer的界限(limit)的位置
Buffer limit(int n)将设置缓冲区界限为n,并返回一个具有新limit的缓冲区对象
Buffer mark()对缓冲区设置标记
int position()返回缓冲区的当前位置position
Buffer position(int n)将设置缓冲区的当前位置为n,并返回修改后的Buffer对象
int remaining()返回position和limit之间的元素个数
Buffer reset()将位置position转到以前设置的mark所在的位置
Buffer rewind()将位置设为0,取消设置的mark

3.5Buffer方法代码演示

public class TestBuffer {
    @Test
    public void test01() {
        //1.分配一个指定大小的缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        System.out.println("capacity:" + byteBuffer.capacity());//1024
        System.out.println("limit:" + byteBuffer.limit());//1024
        System.out.println("position:" + byteBuffer.position());//0

        //2.利用put()存入数据
        byteBuffer.put(new byte[]{97, 98, 99, 100, 101});
        System.out.println("capacity:" + byteBuffer.capacity());//1024
        System.out.println("limit:" + byteBuffer.limit());//1024
        System.out.println("position:" + byteBuffer.position());//5

        /*
         *3.flip()将缓冲区的界限设置为当前位置,并将当前位置充值为0
         * public final Buffer flip() {
         *      limit = position;
         *      position = 0;
         *      mark = -1;
         *      return this;
         * }
         */
        byteBuffer.flip();
        System.out.println("capacity:" + byteBuffer.capacity());//1024
        System.out.println("limit:" + byteBuffer.limit());//5
        System.out.println("position:" + byteBuffer.position());//0

        //4.利用get()读取缓冲区的数据
        byte[] data = new byte[byteBuffer.limit()];
        byteBuffer.get(data);
        System.out.println(Arrays.toString(data));//[97, 98, 99, 100, 101]
        System.out.println("capacity:" + byteBuffer.capacity());//1024
        System.out.println("limit:" + byteBuffer.limit());//5
        System.out.println("position:" + byteBuffer.position());//5

        //5.rewind(),将位置设置为0,取消设置的mark
        byteBuffer.rewind();
        System.out.println("capacity:" + byteBuffer.capacity());//1024
        System.out.println("limit:" + byteBuffer.limit());//5
        System.out.println("position:" + byteBuffer.position());//0

        /*
         * 6.clear(),清空缓冲区,但是缓冲区中的数据依据存在
         * public final Buffer clear() {
         *      position = 0;
         *      limit = capacity;
         *      mark = -1;
         *      return this;
         *   }
         */
        byteBuffer.clear();
    }
    @Test
    public void test02() {
        String str = "abcd";
        //1.分配一个指定大小的缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        //2.利用put()存入数据
        byteBuffer.put(str.getBytes());
        byteBuffer.flip();
        byte[] data = new byte[1024];
        byteBuffer.get(data,0,2);
        System.out.println(new String(data,0,2));//ab
        System.out.println("position:"+byteBuffer.position());//2
        //3.标记当前position的位置
        byteBuffer.mark();
        byteBuffer.get(data,0,2);
        System.out.println(new String(data,0,2));//cd
        System.out.println("position:"+byteBuffer.position());//4
        //4.将position位置设置为mark标记的位置
        byteBuffer.reset();
        System.out.println("position:"+byteBuffer.position());//2
    }

}

3.6直接与非直接缓冲区

(1)字节缓冲区要么是直接的,要么是非直接的。如果为直接字节缓冲区,则java虚拟机会尽最大努力直接在此缓冲区上执行本机I/O操作。也就是说,在每次调用基础操作系统的一个本机I/O操作之前(或之后),虚拟机都会尽量避免将缓冲区的内容复制到中间缓冲区中(或从中间缓冲区中复制内容)。

(2)直接字节缓冲区可以通过调用此类的allocateDirect()工厂方法来创建。此方法返回的缓冲区进行分配和取消分配所需要成功通常高于非直接缓冲区。直接缓冲区的内容可以驻留在常规的垃圾回收堆之外,因此,它们对应用程序的内存需求量造成的影响可能并不明显。所以,建议将直接缓冲区主要分配给哪些易受基础系统的本机I/O操作影响的大型、持久的缓冲区。一般情况下,最好仅在直接缓冲区能在程序性能方面带来明显好处时分配它们。

(3)直接字节缓冲区还可以通过FileChannel的map()方法将文件区域直接映射到内存中来创建。该方法返回MappedByteBuffer。Java平台的实现有助于通过JNI从本机代码创建直接字节缓冲区。如果以上这些缓冲区中的某个缓冲区实例指的时不可访问的内存区域,则试图访问该区域不会更改缓冲区的内容,并且将会在访问期间或稍后的某个时间导致抛出不确定异常。

(4)字节缓冲区是直接缓冲区还是非直接缓冲区可通过调用其isDirect()方法来确定。提高此方法是为了能够在性能关键代码中执行显示缓冲区管理。

(5)非直接缓冲区通过allocate()反复分配缓冲区,将缓冲区建立在JVM的内存中,直接缓冲区通过allocateDirect()反复分配直接缓冲区,将缓冲区简历在物理内存中,可以提高效率。

3.7直接与非直接缓冲区示意图
在这里插入图片描述

在这里插入图片描述
3.8通道(Channel)
由java.nio.channels包定义的。channel表示IO源与目标打开的连接。Channel类似于传统的“流”。只不过Channel本身不能直接访问数据,Channel只能与Buffer进行交互。

3.8.1Java为Channel借口提供的最主要实现类如下:
(1)FileChannel:用于读取、写入、映射和操作文件的通道。
(2)DatagramChannel:通过UDP读写网络中的数据通道。
(3)SocketChannel:通过TCP读写网络中的数据。
(4)ServerSocketChannel:可以监听新进来的TCP连接,对每一个新进来的连接都会创建一个SockerChannel。

3.8.2获取通道的一种方式是对支持通道的对象调用
getChannel()反复。支持通道的类如下:
FileInputStream、FileOutputStream、RandomAccessFile、DatagramSocket、Socket、ServerSocket
获取通道的其它方式是使用Files类的静态反复newByteChannel()获取字节通道。或者通过通道的静态反复open()打开并返回指定的通道。

3.9代码演示

public class TestChannel {
    //非直接缓复制87M大小文件存耗时:694毫秒
    @Test
    public void test01() {
        Instant start = Instant.now();
        //利用(非直接缓冲区)通道完成文件的复制
        FileInputStream fis = null;
        FileOutputStream fos = null;
        FileChannel inChannel = null;
        FileChannel outChannel = null;
        try {
            fis = new FileInputStream("1.exe");
            fos = new FileOutputStream("2.exe");
            //获取通道
            inChannel = fis.getChannel();
            outChannel = fos.getChannel();
            //分配缓冲区的大小
            ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
            //将通道中的数据存入缓冲区中
            while (inChannel.read(byteBuffer) != -1) {
                byteBuffer.flip();
                //将缓冲区的数据写入通道
                outChannel.write(byteBuffer);
                //清空缓冲区
                byteBuffer.clear();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (outChannel != null) {
                try {
                    outChannel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inChannel != null) {
                try {
                    inChannel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        Instant end = Instant.now();
        System.out.println("非直接缓复制87M大小文件存耗时:"+ ChronoUnit.MILLIS.between(start, end)+"毫秒");
    }

    //直接缓复制87M大小文件存耗时:192毫秒
    @Test
    public void test02() {
        Instant start = Instant.now();
        //利用(直接缓冲区)通道完成文件的复制(内存映射文件)
        FileChannel inChannel = null;
        FileChannel outChannel = null;
        try {
            /**
             * public static FileChannel open(Path path, OpenOption... options)
             * @param path 文件路劲
             * @param options 做什么操作
             */
            inChannel = FileChannel.open(Paths.get("1.exe"), StandardOpenOption.READ);
            //StandardOpenOption.CREATE,如果文件存在就覆盖,如果不存在就创建
            //StandardOpenOption.CREATE_NEW,如果文件存在就报错,如果不存在就创建
            outChannel = FileChannel.open(Paths.get("3.exe"), StandardOpenOption.WRITE, StandardOpenOption.READ, StandardOpenOption.CREATE);
            //将缓冲区创建在物理内存中
            MappedByteBuffer inBuffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());
            MappedByteBuffer outBuffer = outChannel.map(FileChannel.MapMode.READ_WRITE, 0, inChannel.size());
            //直接对缓冲区进行数据的读写操作
            byte[] dst = new byte[inBuffer.limit()];
            inBuffer.get(dst);
            outBuffer.put(dst);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (outChannel != null) {
                try {
                    outChannel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inChannel != null) {
                try {
                    inChannel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        Instant end = Instant.now();
        System.out.println("直接缓复制87M大小文件存耗时:"+ ChronoUnit.MILLIS.between(start, end)+"毫秒");
    }
}

3.10分散(Scatter)和聚集(Gather)

3.10.1示意图
在这里插入图片描述
在这里插入图片描述

3.10.2代码演示

@Test
public void test04() {
    //分散,把通道内的数据读取到多个缓冲区中
    RandomAccessFile inRaf = null;
    RandomAccessFile outRaf = null;
    FileChannel inChannel = null;
    FileChannel outChannel = null;
    try {
        inRaf = new RandomAccessFile("1.txt", "rw");
        outRaf = new RandomAccessFile("2.txt", "rw");
        //1.获取通道
        inChannel = inRaf.getChannel();
        //2.分配缓冲区
        ByteBuffer byteBuffer1 = ByteBuffer.allocate(512);
        ByteBuffer byteBuffer2 = ByteBuffer.allocate(1024);
        //3.分散读取
        ByteBuffer[] byteBuffers = {byteBuffer1, byteBuffer2};
        inChannel.read(byteBuffers);
        //4.把buffer切换到读模式
        Arrays.stream(byteBuffers).forEach(Buffer::flip);
        System.out.println("第一个buffer读取的内容是:"+new String(byteBuffer1.array(),0,byteBuffer1.limit()));
        System.out.println("第二个buffer读取的内容是:"+new String(byteBuffer2.array(),0,byteBuffer2.limit()));
        //5.聚集写入
        outChannel = outRaf.getChannel();
        outChannel.write(byteBuffers);
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        if (outChannel != null) {
            try {
                outChannel.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (inChannel != null) {
            try {
                inChannel.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (outRaf != null) {
            try {
                outRaf.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (inRaf != null) {
            try {
                inRaf.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3.11transferFrom()与transferTo()
transferFrom()表示这个通道的数据来之哪个通道;
transferTo()表示将这个通道的数据传输给其它通道。

//使用通道之间的数据传输(直接缓冲区)87M大小文件存耗时:680毫秒
@Test
public void test03() {
    Instant start = Instant.now();
    //利用(直接缓冲区)通道完成文件的复制(内存映射文件)
    FileChannel inChannel = null;
    FileChannel outChannel = null;
    try {
        /**
         * public static FileChannel open(Path path, OpenOption... options)
         * @param path 文件路劲
         * @param options 做什么操作
         */
        inChannel = FileChannel.open(Paths.get("1.exe"), StandardOpenOption.READ);
        //StandardOpenOption.CREATE,如果文件存在就覆盖,如果不存在就创建
        //StandardOpenOption.CREATE_NEW,如果文件存在就报错,如果不存在就创建
        outChannel = FileChannel.open(Paths.get("4.exe"), StandardOpenOption.WRITE, StandardOpenOption.READ, StandardOpenOption.CREATE);
        inChannel.transferTo(0, inChannel.size(), outChannel);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (outChannel != null) {
            try {
                outChannel.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (inChannel != null) {
            try {
                inChannel.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    Instant end = Instant.now();
    System.out.println("使用通道之间的数据传输(直接缓冲区)87M大小文件存耗时:" + ChronoUnit.MILLIS.between(start, end) + "毫秒");
}
《Java NIO》:Channel and Buffer (通道和缓冲区) 《Java NIO》:Channel and Buffer (通道和缓冲区)从今天开始,自己将会了解下Java NIO的相关知识,以及会看下相关的类库源码。和往常自己学习新知识之前,自己都会阅读网上的一些博文和资料,以使自己对这一块的知识有一个大致的了解,然后再按照自己感兴趣的点来研究一点点知识。关于Java NIO这一块的知识,也是如此。关于Java NIO涉及到三个重要的概念:1、Chan 阅读详情

相关推荐

Java NIO 详解---Buffer与Channel

一.NIO 和BIO的比较 NIO是jdk1.4开始提供的一种新的IO方式。原来的 I/O 库(在 java.io.*中) 与 NIO 最重要的区别是数据打包和传输的方式。原来的 I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。面向流 的 I/O 系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器

荒野孤鹰 2312

java中把channel对象存到redis的代码

在 Java 中,可以使用 Redis 的 Java 客户端来连接 Redis 服务并执行 Redis 命令。如果想把 channel 对象存到 Redis 中,可以使用 Redis 的序列化机制,把 channel 对象先序列化成字节数组,然后使用 Redis 命令 SET 将字节数组存到 Redis 中。 以下是示例代码: import redis.clients.jedis.Jedis; ...

weixin_42596011的博客 571

网络-Java中NIO详解(Buffer/Selector/Channel三大组件原理)

NIO(non-blocking IO)概述: BIO为jdk1.4及以上版本里提供的新api ,为所有原始类型(boolean除外) 提供缓存支持的容器。 NIO服务器实现模式为所有请求一个线程,即客户端发送的连接请求都会被注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。 这句话有问题 NIO主要想解决的是BIO的大并发问题: 在使用同步IO的网络应用中,如果要同...

Fly_Fly_Zhang的博客 2671

Netty ChannelBuffer 简介

ChannelBuffer是Netty中比较常用的一个类,其功能类似于字符数组,可以对其进行读写操作。 ChannelBuffer的模型图如下:  +-------------------+------------------+------------------+  | discardable bytes |  readable bytes  |  writable bytes

lxgwm2008的专栏 1万+

软件测试工程师笔试题

这里写目录标题全套软件测试面试笔试题(附答案)二、选折三、添空四、简答(资料是搜集整理的,感谢前辈的解题)无1.区别阶段评审的与同行评审2.什么是软件测试3. 简述集成测试的过程4 怎么做好文档测试5 白盒测试有几种方法6 系统测试计划是否需要同行审批,为什么7Alpha 测试与 beta 的区别8 比较负载测试,容量测试和强度测试的区别。性能测试从使用方便的角度来说,9 测试结束的标准是什么?10 描述软件测试活动的生命周期?11 软件的缺陷等级应如何划分? 软件测试工程师笔试题(附答案) 全套软件测试面

m0_46446002的博客 2549

手把手教你用Cursor + 自定义MCP工具链,让AI帮你搞定App逆向(附adb-mcp/frida-mcp源码)

本文详细介绍了如何利用Cursor IDE与自定义MCP工具链构建AI驱动的App逆向工作流,涵盖adb-mcp和frida-mcp的源码实现与实战应用。通过自然语言指令,AI可自动化完成设备控制、动态Hook和数据分析,显著提升移动安全测试效率。适合安全研究人员和开发者快速掌握智能逆向技术。

weixin_33737134的博客 1301

NIO从零到一入门学习——入门篇之-Channel & Buffer

1、三大组件 1.1Channel & Buffer Channel有一点类似于stream,它就是读取数据的**双向通道,**可以从Channel将数据读入buffer,也可以将buffer的数据写入channel,而之前的stream要么是输入,要么输出,channel比stream更为底层

weixin_52315708的博客 288

PyTorch生成式人工智能(25)——基于Transformer实现机器翻译

不同于循环神经网络 (RNN) 按顺序处理数据,Transformer 以并行的方式处理输入数据(例如句子)。这种并行处理提高了效率,但并未使其能够识别输入的顺序。为了解决这个问题,Transformer 向输入的词嵌入中添加了位置编码。这些位置编码是分配给输入序列中每个位置的独特向量,其维度与输入词嵌入对齐。本节将以英语到法语的翻译为例,通过介绍如何训练 Transformer 模型将英语句子转换为法语,深入理解 Transformer 的架构及自注意力机制的运作方式。

盼小辉丶的博客 2765

【网络编程】NIO三大组件:Channel、Buffer、Selector

网络编程:NIO三大组件(Channle、Buffer、Selector)

一顿输出 932

Win11右下角不显示图标怎么办?Win11右下角不显示图标的解决方法

所以有不少符合资格的小伙伴都下载进行体验了,但是有的小伙伴在升级完系统之后发现桌面右下角不显示任何图标,那么遇到这种情况要怎么办呢?下面就和小编一起来看看有什么解决方法吧。2、接着找到任务栏设置中的“taskbar corner overflow”。3、然后在下方勾选打开想要显示的图标程序就可以了。1、首先右键任务栏,在其中选择“任务栏设置”。目前微软已经正式推出了。

2401_88800025的博客 886

MATLAB - 浮动基座机器人的逆运动学

本例演示如何解决以浮动底座为模型的机器人的逆运动学问题。浮动底座机器人可以在空间中自由平移和旋转,具有六个自由度。浮动基座机器人的逆运动学问题适用于空间应用,即使用安装在浮动和致动基座上的机械臂在空间操纵物体,也适用于躯干和腿部可在空间自由移动的行走机器人。请注意,刚体树对象表示具有固定基体的刚体树。这意味着刚体树的基体在世界中具有固定的位置和方向。您可以在基体上附加一个 “浮动 ”类型的刚体关节,为具有浮动基体的机器人建模,以用于动态模拟等某些应用。

机器人控制与仿真应用 2440

Java面试要点43 - Java中的Buffer与Channel

Java NIO的Buffer和Channel机制为我们提供了一种高效的IO处理方式。通过合理使用这些组件,可以构建出性能更好的IO密集型应用。在实际开发中,需要根据具体场景选择合适的Buffer类型和Channel实现,并注意遵循最佳实践来确保应用的性能和稳定性。

程序媛学姐的博客 1309

多模态论文笔记——BLIP

本文详细介绍这几年AIGC火爆的隐藏功臣,多模态模型:BLIP。

haopinglianlian的博客 2454

Java NIO详解

JAVA NIO 简介 NIO与IO的对比

代码充实生活的博客 1万+

光学材料仿真软件:FDTD Solutions_(4).材料属性的定义与应用

在光学材料仿真软件中,材料属性的定义和应用是至关重要的一步。正确地定义材料属性可以确保仿真结果的准确性和可靠性。本节将详细介绍如何在FDTD Solutions中定义和应用不同的材料属性,包括介质材料、金属材料、色散材料等,并提供具体的代码示例和数据样例。介质材料是光学仿真中最常见的材料类型之一。在FDTD Solutions中,可以通过多种方式定义介质材料,包括使用预定义的材料库、自定义材料参数或导入材料数据文件。FDTD Solutions内置了一个丰富的材料库,包含了许多常用材料的光学性质。

kkchenjj的博客 1403

45、使用 sqlread 函数将数据从数据库表导入 MATLAB

本文详细介绍了如何使用 MATLAB 中的 `sqlread` 函数从不同类型的数据库(如 Microsoft SQL Server 和 SQLite)中导入数据。文章涵盖了 `sqlread` 的基本语法、输入输出参数、使用示例以及注意事项,并通过多个实例演示了自定义导入选项、元信息检索和数据类型转换等内容。此外,还总结了导入数据库数据的通用流程及最佳实践建议,帮助用户更高效地进行数据分析和处理工作。

bash7scripter的博客 134

Java NIO 总结: Channel 通道

在Java NIO中,Channel是一个核心概念,它表示一个打开的连接,可以连接到I/O设备(如磁盘文件、Socket)或者一个支持I/O访问的应用程序。与传统的IO操作相比,NIO通过Channel和Buffer相结合,提高了IO性能和数据传输效率。Channel是Java NIO中的一个核心概念,它提供了一种高效、非阻塞的IO操作方式。通过Channel和Buffer的结合使用,提高了IO性能和数据传输效率。在实际应用中,可以根据需求选择不同的Channel实现来进行高效的IO操作。

码到三十五 2584

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

深入学习NIO三大核心:缓冲区 Buffer、通道Channel、Selector选择器

通道(Channel)是java.nio的第二个创建概念。Channel用于在缓冲区和位于通道另一侧的实体(通常是一个文件或者是一个套接字)之间有效的传输数据。只不过Channel本身不能直接访问数据,Channel只能和Buffer进行交互。NIO的通道和流的区别通道可以同时进行读写,但是流只能读或者只能写通道可以实现异步读写数据通道可以从缓冲读取数据,也可以写数据到缓冲区;BIO中的stream是单向的,

weixin_39038328的博客 1962

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java nio 学习笔记(一) Buffer(缓冲区)与Channel(通道)的相关知识

一.基本概念 IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。 所有语言运行时系统提供执行 I/O 较高级别的工具。在java编程中,标准低版本IO使用流的方式完成I/O操作,所有的I/O

不积跬步无以至千里,不积小流无以成江海。 2万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java NIO之一 NIO和IO的区别 通道(Channel)和缓冲区(Buffer)

文章目录Java NIOJava NIO与IO的主要区别通道(Channel)和缓冲区(Buffer) Java NIO Java NIO(New IO) 是从Java 1.4版本开始引入的一个新的IO API,可以代替标准的Java IO API。 NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作...

码农回顾 2231

《Java源码分析》:Channel and Buffer (通道和缓冲区)

Java NIO的通道类似Java IO中的流。Channel的实现以下是Java NIO中最重要的通道的实现:1、FileChannel:从文件中读写数据2、DatagramChannel:能通过UDP读写网络中的数据。3、SocketChannel:能通过TCP读写网络中的数据。4、ServerSocketChannel:可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。下面先通过一个例子来感受下Channel和Buffer。

smart_an的专栏 1030

java nio 详_java NIO 详解

Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。本系列教程将有助于你学习和理解Java NIO。Java NIO提供了与标准IO不同的IO工作方式:Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总...

weixin_35282700的博客 1万+

五、NIO教程—通道(Channel)和缓冲区(Buffer)讲解

    Java NIO (New IO) 是 Java 的替代 IO API,意思是标准Java IO和Java Networking API 的替代 。Java NIO 提供了与传统 IO API 不同的 IO 编程模型。注意:有时 NIO 被称为非阻塞 IO。然而,这并不是作者最初的意思,最初应该指的是New IO更为恰当一点。此外,部分 NIO API 实际上是阻塞的——例如文件 API——所以标签“非阻塞”会有点误导。 一、什么是非阻塞IO 1.1 非阻塞

猿小许的博客 1853

Java NIO之通道Channel代码实例

文章目录代码实例控制台输出结果 相关Java NIO详解:Java NIO详解 代码实例 import java.io.*; import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.file.Paths; import ...

代码充实生活的博客 1719

JAVA NIO:NIO与OIO的对比以及Channel通道、Selector选择器、Buffer缓冲区的介绍 //高并发

文章目录二 Java NIO(一)NIO对比OIO(二)概述三个核心组件Channel通道Selector选择器Buffer缓冲区(三)Buffer详解1 Buffer类2 四个属性3 重要方法(四)Channel详解1 FileChannel文件通道2 SocketChannel套接字通道3 DatagramChannel数据报通道(五)Selector选择器选择器使用流程:1、获取选择器示例2.将通道注册到选择器四种IO事件类型:SelectableChannel可选择通道validOps()Selec

蛙爸爸的博客 1269

NIO:缓冲区(Buffer);通道(Channel);Files 类常用方法;Path 与 Paths

文章目录NIO一、缓冲区(Buffer)1、Buffer概述2、缓冲区基本属性3、缓冲区常用方法4、演示二、通道(Channel)1、Channel概述2、获取通道方式一:使用支持通道的类的对象调用getChannel() 方法方式二:使用 Files 类的静态方法newByteChannel() 获取字节通道方式三:通道的静态方法 open() 打开并返回指定通道3、通道的数据传输4、NIO...

y_Engineer的博客 1174
上一篇: KMP算法详解
下一篇: Java-NIO详解-(2)非阻塞式网络通信
suixinghero
博客等级 码龄7年 10粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值