您的位置:首页 > 编程语言 > Java开发

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();

                }

            }

      }

          

       
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: