本文记录了NIO与IO的区别,缓冲区的数据存取,直接缓冲区与非直接缓冲区,通道的原理与获取,通道之间的数据传输

.简介

1.NIO简介:  与原来的IO有同样的作用与目的,但是使用的方式完全不同,NIO支持面向缓冲区的,基于通道的IO操作.

2.NIO与IO主要区别:

IO:

(1)面向流 (单向的,一个 输入,一个输出,InputStream,outputStream)

(2)阻塞IO

NIO:

(1)面向缓冲区

(2)非阻塞IO   (Non Blocking IO)

(3)选择器Selectors

//阻塞和非阻塞,针对网络编程(网络IO)而言

3.NIO的核心在于:通道(Channel)和缓冲区(Buffer)

(1)通道(铁路)主要是用来连接的。缓冲区(火车 )负责存取数据,双向

(2)通道表示打开到IO设备(例如文件,套接字的连接)。若需要使用NIO系统,需要获取用于连接IO设备的通道以及用于容纳数据的缓冲区。

然后操作缓冲区,对数据

进行处理。

二.缓冲区的数据存取

缓冲区(Buffer):在 Java NIO 中负责数据的存取。缓冲区就是数组。用于存储不同数据类型的数据,根据数据类型不同(boolean 除外),

提供了相应类型的缓冲 区: ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer
        1.上述缓冲区的管理方式几乎一致,通过 allocate() 获取缓冲区

//分配一个指定大小的缓冲区
ByteBuffer buf = ByteBuffer.allocate(1024);

2.缓冲区存取数据的两个核心方法:(执行存取之前先学4个属性)
              put() : 存入数据到缓冲区中
              get() : 获取缓冲区中的数据

//利用 put() 存入数据到缓冲区中
String str="asdfasdf";
buf.put(str.getBytes());

3.缓冲区中的四个核心属性:
         capacity : 容量,表示缓冲区中最大存储数据的容量。一旦声明不能改变。
         limit : 界限,表示缓冲区中可以操作数据的大小。(limit 后数据不能进行读写)
         position : 位置,表示缓冲区中正在操作数据的位置。
         mark : 标记,表示记录当前 position 的位置。可以通过 reset() 恢复到 mark 的位置
 
         0 <= mark <= position <= limit <= capacity

4.切换读取数据模式

		buf.flip();

5.利用 get() 读取缓冲区中的数据

		byte[] dst = new byte[buf.limit()];
buf.get(dst);
System.out.println(new String(dst, 0, dst.length));

6.rewind() : 可重复读

		buf.rewind();

7.clear() : 清空缓冲区. 但是缓冲区中的数据依然存在,但是处于“被遗忘”状态

		buf.clear();
System.out.println("-----------------clear()----------------");
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity()); System.out.println((char)buf.get());

8.

         if(buf.hasRemaining()){//判断缓冲区中是否还有剩余的数据
Buf.remaining();//获取缓冲区中可以操作的数量
}

三.直接缓冲区与非直接缓冲区

1.非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中
     2.直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中。

优点:可以提高效率(物理内存映射文件)

缺点:缓冲区进行分配和取消分配所需成本高,不易控制

                 //分配直接缓冲区
ByteBuffer buf = ByteBuffer.allocateDirect(1024);
//通过isDirect()判断是不是直接缓冲区
System.out.println(buf.isDirect());

四.通道的原理与获取

1.通道:用于源节点与目标节点的连接。在java nio中负责缓冲区中数据的传输。Chanel本身不存储数据,因此需要配合缓冲区进行传输。

2.通道的主要实现类

Java.nio.channels.Channel接口

FileChannel

SocketChannel(tcp)

ServerSocketChannel(tcp)

DatagramChannel(udp)

3.获取通道

(1)java 针对支持通道的类提供了getChannel()方法

本地IO:

FileInputStream/FileOutputStream

RandomAccessFile随机存取文件流

网络io:

Socket

Serversocket

Datagramsocket

FileInputStream fis = new FileInputStream("d:/1.txt");
FileChannel inChannel== fis.getChannel();

4.通道之间的数据传输

transferFrom(),transferTo()这两方法用其中一个就行

                FileChannel inChannel = FileChannel.open(Paths.get("d:/1.txt"), StandardOpenOption.READ);
FileChannel outChannel = FileChannel.open(Paths.get("d:/2.txt"), StandardOpenOption.WRITE, StandardOpenOption.READ, StandardOpenOption.CREATE);
// inChannel.transferTo(0, inChannel.size(), outChannel);
outChannel.transferFrom(inChannel, 0, inChannel.size());
inChannel.close();
outChannel.close();

END!

下次会记录一下分散读取与聚集写入,字符集,阻塞与非阻塞相关的。希望可以帮到想要学习的人。如果哪写的不对,希望指正。

NIO笔记---上的更多相关文章

  1. pyqt样式表语法笔记(上) --原创

    pyqt样式表语法笔记(上) pyqt QSS python 样式表 因为软件课设的原因开始学习使用pyqt4,才发现原来它也有样式表,而且语法跟css基本相同,而且一些功能实现起来感觉比js要简单方 ...

  2. Typora笔记上传到博客

    Typora笔记上传到博客 Markdown是一种轻量级标记语言,排版语法简洁,让人们更多地关注内容本身而非排版.它使用易读易写的纯文本格式编写文档,可与HTML混编,可导出 HTML.PDF 以及本 ...

  3. 黑马程序员----java基础笔记上(毕向东)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 笔记一共记录了毕向东的java基础的25天课程,分上.中.下 本片为上篇,涵盖前10天课程 1. ...

  4. Java nio 笔记:系统IO、缓冲区、流IO、socket通道

    一.Java IO 和 系统 IO 不匹配 在大多数情况下,Java 应用程序并非真的受着 I/O 的束缚.操作系统并非不能快速传送数据,让 Java 有事可做:相反,是 JVM 自身在 I/O 方面 ...

  5. Bootstrap学习笔记上(带源码)

    阅读目录 排版 表单 网格系统 菜单.按钮 做好笔记方便日后查阅o(╯□╰)o bootstrap简介: ☑  简单灵活可用于架构流行的用户界面和交互接口的html.css.javascript工具集 ...

  6. Java Nio 笔记

    网上的很多关于NIO的资料是不正确的,nio 支持阻塞和非阻塞模式 关于读写状态切换 在读写状态切换的情况下是不能使用regedit 方法注册,而应该使用以下方式进行 selectionKey.int ...

  7. 《Windows核心编程》读书笔记 上

    [C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...

  8. Java NIo 笔记001

    1. Channel Channel接口只提供了两个方法: package java.nio.channels; public interface Channel { public boolean i ...

  9. 【Java nio】java nio笔记

    缓冲区操作:缓冲区,以及缓冲区如何工作,是所有I/O的基础.所谓“输入/输出”讲的无非就是把数据移出货移进缓冲区.进程执行I/O操作,归纳起来也就是向操作系统发出请求,让它要么把缓冲区里的数据排干,要 ...

随机推荐

  1. squashfs文件系统

    一.Squashfs文件系统简介 squashfs是以linux 内核源码补丁的形式发布,附带mksquashfs工具,用于创建squash文件系统.squashfs可以将整个文件系统或者某个单一的目 ...

  2. Echarts---柱状图实现

    做Echarts很简单,可以参看官网 http://echarts.baidu.com/index.html 作为程序员我们只需要把静态数据替换成我们自己需要的! 下面看一个自己做的例子: 还是先看看 ...

  3. React Native 网络层分析

    文:志俊(沪江Web前端) 本文原创,转载请注明作者及出处 在使用React Native开发中,我们熟练的采用JavaScript的方式发送请求的方式发送一个请求到服务端,但是处理这个请求的过程其实 ...

  4. mongodb数据库安装

    mongodb的安装 1,下载安装包: http://www.runoob.com/mongodb/mongodb-window-install.html 2,安装至:    D:\MongoDB,将 ...

  5. Java内存管理及对Java对象管理

    Java内存管理及对Java对象管理 1Java内存管理 1.1Java中的堆和栈 通常来说,人们会将Java内存氛围栈内存(Stack)和堆内存(Heap). 栈内存用来保存基本类型的变量和对象的引 ...

  6. mac上安装mongodb数据库教程

    1.官网下载压缩包,并解压到当地任一目录.(我的是Documents/develop/mongodb) 2.在mongodb下新建data文件夹,在data下新建db文件夹.(bin和data文件夹在 ...

  7. [51nod1709]复杂度分析

    给出一棵n个点的树(以1号点为根),定义dep[i]为点i到根路径上点的个数.众所周知,树上最近公共祖先问题可以用倍增算法解决.现在我们需要算出这个算法精确的复杂度.我们定义计算点i和点j最近公共组先 ...

  8. [51nod1474]宝藏图

    有n堆宝藏,每一堆宝藏有一个挖掘所需要的时间ti,有一个价值qi. 现在是做一个宝藏图.这个宝藏图是这样的,宝藏图的形状是一棵二叉树,二叉树刚好有k个叶子结点,从n堆宝藏中选k堆放到二叉树的叶子结点上 ...

  9. [bzoj1705] [Usaco2007 Nov]Telephone Wire 架设电话线

    正常DP.. f[i][j]表示前i个电线杆,把第i个电线杆高度改为j的最少总费用.设原来电线杆高度为h[] f[i][j]=min{ f[i-1][k]+C*|j-k|+(j-h[i])^2,(k& ...

  10. ACM中常见错误对应表

    因为经常写错题,找了个这个看看... 传送门:http://www.cnblogs.com/ZouCharming/p/3868844.html 我太垃圾了... 我出现过的错误: Wrong Ans ...