Java NIO的使用
2015-09-11 18:46
585 查看
NIO是New I/O的简称,是相对基于流形式I/O方法的另一套java I/O标准。与流式的I/O不同,NIO是基于块(BLock)的,它以块为基本单位处理数据。在NIO中,最为重要的两个组件是缓冲Buffer和通道Channel。缓冲是一块连续的内存块,是NIO读取数据的中转地。通道表示缓冲数据的源头或者目的地,它用于向缓冲区读取或者写入数据,是访问缓冲区的接口。下面展示一个使用NIO进行文件复制的例子,它展示了通过NIO进行文件读取和文件写入操作(可以直接复制到main函数中执行):
下面再介绍一下Buffer的基本原理,只有知道了这些基本的原理,才有可能正确使用NIO。
Buffer中有3个重要的参数:位置(position)、容量(capacity)和上限(limit)。三者的含义如下:
位置(position):当前缓冲区的位置(相当于一个指针),将从该位置写(读)数据,初始时指向0;
容量(capacity):缓冲区的总容量上限(其实就是一个指向缓冲区末尾的指针,这个位置是不可以用的(读写));
上限(limit):缓冲区的实际上限,主要是为读模式服务的,表示可以读取到这里(但该位置不可以读)。
上述三个参数都是指针,下面有一段程序可以让大家有个更清楚的认识:
程序的输出为:
public static void nioCopyFile(String resource, String destionation) throws IOException { FileInputStream fis = new FileInputStream(resource); FileOutputStream fos = new FileOutputStream(destionation); FileChannel readChannel = fis.getChannel(); FileChannel writeChannel = fos.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024);//分配一个新的字节缓冲区 while(true) { buffer.clear();//清除此缓冲区。将位置设置为 0,将限制设置为容量,并丢弃标记 //将字节序列从此通道读入给定的缓冲区。如果该通道已到达流的末尾,则返回 -1 int len = readChannel.read(buffer); if(len == -1) { break; } //反转此缓冲区。首先将限制设置为当前位置,然后将位置设置为 0。如果已定义了标记,则丢弃该标记 buffer.flip(); writeChannel.write(buffer); } readChannel.close(); writeChannel.close(); }
下面再介绍一下Buffer的基本原理,只有知道了这些基本的原理,才有可能正确使用NIO。
Buffer中有3个重要的参数:位置(position)、容量(capacity)和上限(limit)。三者的含义如下:
位置(position):当前缓冲区的位置(相当于一个指针),将从该位置写(读)数据,初始时指向0;
容量(capacity):缓冲区的总容量上限(其实就是一个指向缓冲区末尾的指针,这个位置是不可以用的(读写));
上限(limit):缓冲区的实际上限,主要是为读模式服务的,表示可以读取到这里(但该位置不可以读)。
上述三个参数都是指针,下面有一段程序可以让大家有个更清楚的认识:
private static void show() { ByteBuffer b = ByteBuffer.allocate(15); System.out.println("limit=" + b.limit() + " capacity=" + b.capacity() + " position=" + b.position()); for(int i = 0; i < 10; i++) { b.put((byte)i); } System.out.println("limit=" + b.limit() + " capacity=" + b.capacity() + " position=" + b.position()); b.flip(); System.out.println("limit=" + b.limit() + " capacity=" + b.capacity() + " position=" + b.position()); for(int i = 0; i < 5; i++) { System.out.print(b.get()); } System.out.println(); System.out.println("limit=" + b.limit() + " capacity=" + b.capacity() + " position=" + b.position()); b.flip(); System.out.println("limit=" + b.limit() + " capacity=" + b.capacity() + " position=" + b.position()); }
程序的输出为:
相关文章推荐
- 关于Eclipse快捷键操作会了这些你就是大神!
- java script5继承
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
- JAVA SE 基础复习-泛型的使用
- java 笔记
- JAVA SE 基础复习-核心库-Map---java.util
- 二叉排序树相关操作
- java深入学习(二)
- 工作后好多师弟师妹问我spring aop,我就写了这样一个例子
- java final计算
- 浅析Java中的final关键字
- struts2请求控制器
- Struts2的OGNL标签详解
- [置顶] Java引用的一些理解
- 当年第一次学习java多线程写的例子,从此多线程不再陌生
- spark取得lzo压缩文件报错 java.lang.ClassNotFoundException: Class com.hadoop.compression.lzo.LzoCodec
- spark取得lzo压缩文件报错 java.lang.ClassNotFoundException: Class com.hadoop.compression.lzo.LzoCodec
- EL表达式学习
- JDK,JRE,JVM区别与联系
- Java 反射