Capacity
A buffer's capacity is the number of elements it contains. The capacity of a buffer is never negative and never changes.
Limit
A buffer's limit is the index of the first element that should not be read or written. A buffer's limit is never negative and is never greater than its capacity.
limit 变量限制了当前buffer中可操作的容量大小。 向buffer写入数据时limit =capacity (除非使用limit(n)限制了limit大小),表明可写入的容量为limit ;调用flip()时Limit=Position,表面当前buffer可读取的容量是limit。
Position
A buffer's position is the index of the next element to be read or written. A buffer's position is never negative and is never greater than its limit.
在从通道读取时,您将所读取的数据放到底层的数组中。 position 变量跟踪已经写了多少数据。更准确地说,它指定了下一个字节将放到数组的哪一个元素中。因此,如果您从通道中读三个字节到缓冲区中,那么缓冲区的 position 将会设置为3,指向数组中第四个元素。
同样,在写入通道时,您是从缓冲区中获取数据。 position 值跟踪从缓冲区中获取了多少数据。更准确地说,它指定下一个字节来自数组的哪一个元素。因此如果从缓冲区写了5个字节到通道中,那么缓冲区的 position 将被设置为5,指向数组的第六个元素。
Mark
A buffer's mark is the index to which its position will be reset when the reset
method is invoked. The mark is not always defined, but when it is defined it is never negative and is never greater than the position.
标记读写的位置
0 <= mark <= position <= limit <= capacity
remaining= limit - position
默认值:
mark =-1 (未定义)
position =0
limit = capacity = n
重要方法:
flip() 由写buffer模式 改为从buffer读出模式
public final Buffer flip() { limit = position; position = 0; mark = -1; return this; }
clear() 重新回到写buffer模式
public final Buffer clear() { position = 0; limit = capacity; mark = -1; return this; }
mark() 标记当前读或写得位置
public final Buffer mark() { mark = position; return this; }
reset() 回到标记的位置
public final Buffer reset() { int m = mark; if (m < 0) throw new InvalidMarkException(); position = m; return this; }
discarkMark() 清除标记
final void discardMark() { // package-private mark = -1; }
rewind() 位置归0,清除标记, 从头开始读或写
public final Buffer rewind() { position = 0; mark = -1; return this; }
以下对比两种不同IO copy文件的方式:
@Test public void copyByIO() throws Exception{ FileInputStream fin = new FileInputStream("E:\\TechTools\\windows\\DEEP_GHOST_WIN7_SP1_X64_V2016_01.iso"); FileOutputStream fout = new FileOutputStream("D:\\Data\\Log\\future\\DEEP_GHOST_WIN7_SP1_X64_V2016_01.iso"); byte[] buffer = new byte[1024*1024]; while(fin.read(buffer, 0, 1024*1024)!=-1){ fout.write(buffer); } fin.close(); fout.close(); } @Test public void copyByNIO() throws Exception{ FileInputStream fin = new FileInputStream("E:\\TechTools\\windows\\DEEP_GHOST_WIN7_SP1_X64_V2016_01.iso"); FileOutputStream fout = new FileOutputStream("D:\\Data\\Log\\future\\DEEP_GHOST_WIN7_SP1_X64_V2016_01.iso"); try { FileChannel chin = fin.getChannel(); FileChannel chout = fout.getChannel(); ByteBuffer buffer =ByteBuffer.allocate(1024*1024); int flag = 0; while(flag!=-1){ buffer.flip(); chout.write(buffer); buffer.clear(); flag = chin.read(buffer); } } catch (Exception e) { e.printStackTrace(); }finally{ fin.close(); fout.close(); } }
测试结果: NIO比IO略快。
Direct Buffer
与ByteBuffer.allocate(1024*1024)相似的另一个方法是ByteBuffer.allocateDirect(1024*1024)。它直接在OS内核分配内存,不占用JVM空间,就好比是“内核缓冲区”的内容直接写入了Channel,减少了数据拷贝,因此速度更快。著名的Netty就是使用DirectBuffer。
MappedByteBuffer
将文件的全部或部分直接映射到内存,可以实现对文件的快速随机读取,对MappedByteBuffer的修改操作也可以直接反应到文件
@Test public void testMappedByteBuffer() throws Exception{ RandomAccessFile file = new RandomAccessFile("D:\\Data\\Log\\future\\1.txt", "rw"); FileChannel chin = file.getChannel(); MappedByteBuffer buffer = chin.map(MapMode.READ_WRITE, 0, chin.size()); buffer.put(0, (byte)1); file.close(); }
参考:
https://www.ibm.com/developerworks/cn/education/java/j-nio/index.html
<Direct buffer 与Heap Buffer的区别>http://blog.csdn.net/shibushiyouwenti/article/details/7396016
相关推荐
java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...
Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于替代标准I/O(BIO)模型的一种新机制。NIO在Java 1.4版本引入,提供了更高效的数据处理和通道通信方式,特别适用于高并发、大数据...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...
### Java NIO 处理超大数据文件的知识点详解 #### 一、Java NIO简介 Java NIO(New IO)是Java平台上的新输入/输出流API,它提供了与传统IO(即Java IO)不同的数据处理方式。NIO在Java 1.4版本引入,并在后续版本...
Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...
Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...
Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(IO)相比,提供了更加高效的数据传输方式。在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O模型的新技术。在传统的Java IO模型中,读写操作是阻塞的,即当调用read或write方法时,线程会等待数据准备好或...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java I/O模型(BIO)在处理大量并发连接时效率较...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O模型的新技术。在Java 1.4版本中引入,NIO提供了一种全新的I/O编程方式,使得Java开发者能够更高效地处理I/O操作...
### Java NIO 实现Socket通信详解 #### 一、NIO与传统IO的区别及优势 在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效、灵活的I/O操作方式。NIO与传统的 Blocking I/O(阻塞I/O)模式相比,...