java NIO1 学习
2016-06-27 23:10
387 查看
我以前只是知道IO流并不知道有NIO流,也是有一次听到别人说有NIO流,所以也就学了一下,长话短说,下面是我所学的成果!
总结:
1.NIO1 是jdk1.4以后才有的,jdk1.7又有了NIO2 ,NIO不同于我们平时用的面向对象流,其实本质都是流,但是实现的机制不同,因为IO流采用的是指针的移动,进行读取数据, 而NIO流采用的是映射的机制,他会把文件块映射到内存当中,你可以想一下,利用指针的移动读取数据快,还是直接在内存块中读取数据更快,显而后者更快。
2.NIO中最重要的两大核心:chanl(通道)、buffer(缓存)
chanl与传统面向IO流 inputStream,outputStream,多了一个map方法,这个map可以把相应对象映射到内存当中,利用buffer读取chanl里面的数据(当文件比较大的时候用“竹筒取水的方式进行取数据”),如果文件相对较小的时候chanl可以把数据直接进行映射到buffer当中
(1)buffer:buffer更像一个数组,buffer是一个抽象类,最常用的就是byteBuffer,下面还有intBuffer,longBuffer,doubleBuffer...除了boolean类型的buffer.
buffer几个比较重要得成员 position limit 和capacity
创建buffer的时候首先要初始化它的空间,capacity,capacity决定了buffer一次可从chanl那边读取多少的数据,初始化的时候limit在capacity的位置position为0,当存入数据结束后然后调用flip方法,这个方法,是为了进行读取数据做准备,当调用了flip之后limit就会移动到position的位置,position为0然后进行读取数据,position向后移动,就会出现上面的图片那样。当读取完数据后,再次调用clear()操作,为下一次读取数据做准备,调用完clear()方法之后posion归0,limit就会移动到capacity的位置(但数据不清空)。
public class BufferTest{
public static void main(String[] agrs){
CharBuffer buffer=CharBuffer.allocate(8);
buffer.put("你");
buffer.put("好");
buffer.flip();
System.out.print("获取第一个元素"+buff.get());
System.out.print("获取第一个元素"+buff.get());
System.out.print("获取第一个元素"+buff.get());
buffer.clear();
}
}
(2)chanl(通道):
(1)chanl可以将所有数据或部分数据全部映射到buffer当中;
(2)可以通过buffer向chanl中取数据,chanl只能通过buffer来进行数据的读取和写入
chanl并不是通过构造函数来创建,而是通过传统的节点,inputStream,outputStream,fileInputStream,fileOutputStream,pipedInputStream,pipedOutputStream的getChal()方法来创建不同的chanl, 分别创建了 chanl,fileChanl,PipedChanl
chanl 下面有三个方法,map(),read(),write() ;
chanl通过 MappedByteBuffer map(FileChanl.Mapmode mapmode,long position,long size) ;来进行映射,把部分或全部文件映射成byteBuffer , mapmode 包含“只读” ,“只写”,“读写” position和size 进行读取那部分内容,read 和write和面向IO流的操作是一样的。
1.直接映射:
public class FileChanlTest{
public static void main(String[] args){
//创建文件对象
File file=new File("FileChanlTest.java");
//通过文件输入流来获取相应的文件输入chanl
FileInputChanl inChanl=new FileInputStream(file).getChanl();
//通过文件输出流来获取相应的文件输出chanl
FileOutputChanl outChanl= new FileOutputStream(“test.txt”).getChanl();
//chanl直接映射成为ByteBuffer
ByteBuffer buffer=inChanl.MappedByteBuffer (FileChanl.Mapmode .READ_ONLY,0,file.length());
//把buffer写入到outChanl中
outChanl.write(buffer);
//创建charset
Charset charset=Charset.forName("GBK");
//通过charset来创建解析器
CharsetDecode rdecode=charset.newDecoder();
//解析器解析buffer,把bytebuffer转换成charBuffer
CharBuffer charbuffer=decode.decode(buffer);
System.out.print(charBuffer);
}
}
2.通过RandomFileChanl进行随机操作:
public calss RandomFileChanlTest{
public static void main(String[] agrs){
File file=new File("a.txt");
RandomAccessFile random=new RandomAccessFile(f,"rw");
Chanl chanl=random.getChanl();
ByteBuffer buffer=chanl.map(FileChanl.MapMode.READ_ONLY,0,file.length());
chanl.position(buffer.length());
System.out.print(buffer);
}
}
3.通过read进行读取操作:
public class readFile{
public static void main(String[] args){
Chanl inchanl=new FileInputStream("readFile.java").getChanl();
ByteBuffer buff=Buffer.allcator(64);
while((buff.read(inchal))!=-1){
buff.flip();
Charset charset=Charset.forName("GBK");
ChaeBuffer charbuffer=charset.decode(buff);
System.out.print(charbuffer);
buff.clear();
}
}
}
总结:
1.NIO1 是jdk1.4以后才有的,jdk1.7又有了NIO2 ,NIO不同于我们平时用的面向对象流,其实本质都是流,但是实现的机制不同,因为IO流采用的是指针的移动,进行读取数据, 而NIO流采用的是映射的机制,他会把文件块映射到内存当中,你可以想一下,利用指针的移动读取数据快,还是直接在内存块中读取数据更快,显而后者更快。
2.NIO中最重要的两大核心:chanl(通道)、buffer(缓存)
chanl与传统面向IO流 inputStream,outputStream,多了一个map方法,这个map可以把相应对象映射到内存当中,利用buffer读取chanl里面的数据(当文件比较大的时候用“竹筒取水的方式进行取数据”),如果文件相对较小的时候chanl可以把数据直接进行映射到buffer当中
(1)buffer:buffer更像一个数组,buffer是一个抽象类,最常用的就是byteBuffer,下面还有intBuffer,longBuffer,doubleBuffer...除了boolean类型的buffer.
buffer几个比较重要得成员 position limit 和capacity
创建buffer的时候首先要初始化它的空间,capacity,capacity决定了buffer一次可从chanl那边读取多少的数据,初始化的时候limit在capacity的位置position为0,当存入数据结束后然后调用flip方法,这个方法,是为了进行读取数据做准备,当调用了flip之后limit就会移动到position的位置,position为0然后进行读取数据,position向后移动,就会出现上面的图片那样。当读取完数据后,再次调用clear()操作,为下一次读取数据做准备,调用完clear()方法之后posion归0,limit就会移动到capacity的位置(但数据不清空)。
public class BufferTest{
public static void main(String[] agrs){
CharBuffer buffer=CharBuffer.allocate(8);
buffer.put("你");
buffer.put("好");
buffer.flip();
System.out.print("获取第一个元素"+buff.get());
System.out.print("获取第一个元素"+buff.get());
System.out.print("获取第一个元素"+buff.get());
buffer.clear();
}
}
(2)chanl(通道):
(1)chanl可以将所有数据或部分数据全部映射到buffer当中;
(2)可以通过buffer向chanl中取数据,chanl只能通过buffer来进行数据的读取和写入
chanl并不是通过构造函数来创建,而是通过传统的节点,inputStream,outputStream,fileInputStream,fileOutputStream,pipedInputStream,pipedOutputStream的getChal()方法来创建不同的chanl, 分别创建了 chanl,fileChanl,PipedChanl
chanl 下面有三个方法,map(),read(),write() ;
chanl通过 MappedByteBuffer map(FileChanl.Mapmode mapmode,long position,long size) ;来进行映射,把部分或全部文件映射成byteBuffer , mapmode 包含“只读” ,“只写”,“读写” position和size 进行读取那部分内容,read 和write和面向IO流的操作是一样的。
1.直接映射:
public class FileChanlTest{
public static void main(String[] args){
//创建文件对象
File file=new File("FileChanlTest.java");
//通过文件输入流来获取相应的文件输入chanl
FileInputChanl inChanl=new FileInputStream(file).getChanl();
//通过文件输出流来获取相应的文件输出chanl
FileOutputChanl outChanl= new FileOutputStream(“test.txt”).getChanl();
//chanl直接映射成为ByteBuffer
ByteBuffer buffer=inChanl.MappedByteBuffer (FileChanl.Mapmode .READ_ONLY,0,file.length());
//把buffer写入到outChanl中
outChanl.write(buffer);
//创建charset
Charset charset=Charset.forName("GBK");
//通过charset来创建解析器
CharsetDecode rdecode=charset.newDecoder();
//解析器解析buffer,把bytebuffer转换成charBuffer
CharBuffer charbuffer=decode.decode(buffer);
System.out.print(charBuffer);
}
}
2.通过RandomFileChanl进行随机操作:
public calss RandomFileChanlTest{
public static void main(String[] agrs){
File file=new File("a.txt");
RandomAccessFile random=new RandomAccessFile(f,"rw");
Chanl chanl=random.getChanl();
ByteBuffer buffer=chanl.map(FileChanl.MapMode.READ_ONLY,0,file.length());
chanl.position(buffer.length());
System.out.print(buffer);
}
}
3.通过read进行读取操作:
public class readFile{
public static void main(String[] args){
Chanl inchanl=new FileInputStream("readFile.java").getChanl();
ByteBuffer buff=Buffer.allcator(64);
while((buff.read(inchal))!=-1){
buff.flip();
Charset charset=Charset.forName("GBK");
ChaeBuffer charbuffer=charset.decode(buff);
System.out.print(charbuffer);
buff.clear();
}
}
}
相关文章推荐
- 导入Eclipse工程 到 Android Studio
- win10 破解-myeclipse10.7.1-存在问题及解决办法
- eclipse项目红色叹号解决方法 eclipse导入jar包
- Java第二部分 面向对象
- java开发环境设置
- 第二章 java基础(用户自定义类型)
- 第二章 java基础(二进制补码)
- JDK、JRE、JVM三者间的关系
- 第二章 java基础(二进制与十进制的转换)
- java.util.ConcurrentModificationException
- Hadoop(hadoop,HBase)组件import到eclipse
- java基础篇(七)super关键字
- eclipse.ini相关配置
- Unbound classpath container: 'JRE System Library [jdk17060]' in project ***
- 关于类命名的问题
- JDK多版本下如何设置jdk 1.8为默认jdk
- Eclipse常用快捷键
- struts2 action 3中书写方式
- struts 2.5.1第一个测试应用
- eclipse配置javap命令教程