1.  IO和NIO的区别
 IO     面向流(stream oriented)  阻塞(blocking io) 无  
                NIO  面向缓冲区(buffer oriented)非阻塞(Non blocking io)选择器(selectors)
Java NIO的系统核心在于:通道(Channel)和缓冲区(Buffer)。通道表示打开到IO设备(例如文件、套接字)的连接。若需要使用NIO
系统,需要获取用于连接IO设备的通道和用于容纳数据的缓冲区。然后操作缓冲区,对数据进行处理。
简言之:Channel负责传输,Buffer负责存储
2.缓冲区的数据存取
 底层数据  根据数据类型的不同(boolean) 提供对应类型的缓冲区
 ByteBuffer
 CharBuffer
 ShortBuffer
 IntBuffer
 LongBuffer
 FloatBuffer
 DoubleBuffer
 
 ByteBuffer buf = new ByteBuffer,allocate(1024);
 缓冲区的核心方法:put()存数据     get()取出数据
 缓冲区的四个核心属性:capacity容量    limit界限   position位置  mark标记(reset()方法恢复position的位置)
 0 <=mark<=position<=limit<=capacity
 flip()切换到读取数据的模式 
 rewind()可重复读数据
 clear()清空缓冲区 数据依然存在,但是处于“被遗忘”状态
3.直接缓冲区和非直接缓冲区
 直接缓冲区:通过allocate()分配,将缓冲区建立在JVm内存中
 非直接缓冲区:通过allocateDirect()分配,将缓冲区建立在物理内存中,可以提高效率
 isDirect()判断是否是直接缓冲区
 
4非直接缓冲区进行文件复制
package com.hpd.nio;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel; import org.junit.jupiter.api.Test; public class TestChannel {
//非直接缓冲区进行文件复制
@Test
public void test1() {
FileInputStream fin = null;
FileOutputStream fos = null;
// 获取通道
FileChannel inChannel = null;
FileChannel outChannel = null;
try {
fin = new FileInputStream("1.png");
fos = new FileOutputStream("2.png"); inChannel = fin.getChannel();
outChannel = fos.getChannel(); // 分配指定大小的缓冲区
ByteBuffer buffer = ByteBuffer.allocate(); // 将通道中的数据写入缓冲区
while ((inChannel.read(buffer)) != -) {
buffer.flip(); // 切换成读模式
// 将缓冲区中的数据写入通道
outChannel.write(buffer);
buffer.clear(); // 清空缓冲区
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} 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 (fin != null) {
try {
fin.close();
} catch (IOException e) {
e.printStackTrace();
}
} } } }

5.直接缓冲区进行文件复制

//直接缓冲区进行文件的复制(内存映射文件)
@Test
public void test2() throws IOException {
FileChannel inChannel = FileChannel.open(Paths.get("1.png"), StandardOpenOption.READ);
FileChannel outChannel = FileChannel.open(Paths.get("3.png"),StandardOpenOption.READ,StandardOpenOption.WRITE,StandardOpenOption.CREATE); //内存映射文件
MappedByteBuffer inMapBuffer = inChannel.map(MapMode.READ_ONLY, 0, inChannel.size());
MappedByteBuffer outMapBuffer = outChannel.map(MapMode.READ_WRITE, 0, inChannel.size()); //直接对缓冲区进行数据的读写操作
byte[] dst = new byte[inMapBuffer.limit()];
inMapBuffer.get(dst);
outMapBuffer.put(dst); inChannel.close();
outChannel.close();
}
 
 

NIO基本概念的更多相关文章

  1. Mina入门:Java NIO基础概念

    JDK1.4引入了Java NIO API(Java New IO),Java NIO得到了广泛应用.NIO允许程序进行非阻塞IO操作.java.nio.* 包括以下NIO基本结构: Buffer - ...

  2. JAVA NIO 主要概念

    NIO有三个主要概念: buffer channel selector channel间通过buffer通信,channel在selector注册后,可以由selector管理,实现非阻塞编程 buf ...

  3. 一 NIO的概念

    Java NIO由下列几个核心部分组成: Channels(通道) Buffers(缓冲区) Asynchronous IO(异步IO) Channel 和 Buffer 基本上所有的IO在NIO中都 ...

  4. 传统IO与NIO的比较

    本文并非Java.io或Java.nio的使用手册,也不是如何使用Java.io与Java.nio的技术文档.这里只是尝试比较这两个包,用最简单的方式突出它们的区别和各自的特性.Java.nio提出了 ...

  5. 一篇文章让你成为 NIO 大师 - MyCAT通信模型

    这篇文章没有详细介绍 NIO 的概念,对于 NIO 不了解的同学,可根据自己需要,阅读这篇介绍 NIO 的博客    io.mycat.net.NIOAcceptor NIOAcceptor负责处理客 ...

  6. java 的nio与io对比

    转:本文并非Java.io或Java.nio的使用手册,也不是如何使用Java.io与Java.nio的技术文档.这里只是尝试比较这两个包,用最简单的方式突出它们的区别和各自的特性.Java.nio提 ...

  7. java NIO编程(转)

    一.概念 在传统的java网络编程中,都是在服务端创建一个ServerSocket,然后为每一个客户端单独创建一个线程Thread分别处理各自的请求,由于对于CPU而言,线程的开销是很大的,无限创建线 ...

  8. Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

    Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...

  9. Java NIO简单介绍(一)

    Java NIO( New IO) 是从Java 1.4版本开始引入的 一个新的IO API,可以替代标准的Java IO API. NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NI ...

随机推荐

  1. grovvy pipeline 部署

    pipeline { agent any stages { stage('Checkout') { steps { echo 'Checkout' checkout([$class: 'GitSCM' ...

  2. 真机测试出现INSTALL_FAILED_USER_RESTRICTED安装错误

    之前用小米测试的时候遇到一个问题,两个一样型号的手机一个能直接用Android Studio安装公司的项目一个却不可以,总是报INSTALL_FAILED_USER_RESTRICTED错误,具体见下 ...

  3. 统计Azure存储的HBase各表数据量

    场景:HBase存储在Azure上,现在通过访问Azure Storage的接口,获取HBase中各个表的数据量. 注意: 1.Azure存储,默认的副本数为2,即共存3份,但只收1份的费用,取到的s ...

  4. 关于lora标配SPDT大功率射频开关

    SPDT大功率的UltraCMOS ™DC - 3.0 GHz射频开关              PE4259的UltraCMOS ™射频开关被设计为覆盖广泛的,通过3000兆赫从近DC应用.这种反射 ...

  5. jQuery 基础与运用

    1.  jquery引入以及入口函数 引入方式 <!--方式一:下载到本地,引入路径--> <script src="jquery-3.1.1.min.js"&g ...

  6. 新版u-boot移植到s3c2440开发板(一)--建立单板

    由于没有系统的学习shell,所以Makefile大多数看不懂,一个小小的细节,把我难住了几天.现在开始分享我的操作过程 本文所有linux下的操作是root用户,如果你使用普通用户,请在命令前加上 ...

  7. 一个yum源for centos6.x

    rpm -Uvh http://www.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-1-12.rhel6.noarch.rpm

  8. IceStorm示例运行步骤

    又一次忘了,记下: 1.启动IceStorm服务,输入:icebox --Ice.Config=config.icebox 启动IceStorm服务.2.消息接收:开启另一个命令行窗口,Subscri ...

  9. # 课堂测试(CH6)20155218

    课堂测试(CH6) 1. 下面代码中,对数组x填充后,采用直接映射高速缓存,所有对x和y引用的命中率为(D) A . 1 B . 1/4 C . 1/2 D . 3/4 解析:在x[0],y[0]时发 ...

  10. jquery选择器:获取父级元素、同级元素、子元素

    jQuery的出现给广大开发者提供了不少的方便.从要自己一个一个敲代码,到直接调用方法,无疑大大地提高了网站开发的效率.而在jQuery中有一些方法非常的实用.下面就给大家介绍下jquery选择器:获 ...