Java Nio

Wesley13
• 阅读 622

(1)NIO

a)  Nio之所以比旧的io速度快是因为,nio使用的结构更接近于系统操作执行io的操作:通道和缓冲器.

(2)如何操作nio读写数据

Nio读写方式可以想象成:数据源和数据目的地是煤矿与煤场,通道想象成告诉公路,缓冲器是卡车,nio中的FileChannel是装卸煤用的工具,ByteBuffer是装煤用的卡车.在新的io中我们不对通道进行直接操作.在使用卡车前首先我们需要一个卡车(ByteBuffer)我们可以使用ByteBuffer的静态方法allocate或者allocateDirect方法构造出ByteBuffer实例(有点像C语言中的malloc函数).使用FileChannel的write/read方法进行装卸,write方法可以想象成卸载煤矿,在卸载前需要调用ByteBuffer的flip方法,read方法可以想象成装载,装载前调用clear方法.一下是个简单的势力:

public static void main(String[] args) throws Exception         {
            File srcf=new File("D:\\aa.mp4");
            File tarf=new File("D:\\ww.mp4");
            FileInputStream fis=new FileInputStream(srcf);
            FileOutputStream fos=new FileOutputStream(tarf);
            FileChannel fic=fis.getChannel();
            FileChannel foc=fos.getChannel();
            ByteBuffer buf=ByteBuffer.allocate(1024);
            while (fic.read(buf)!=-1) {
                buf.flip();
                foc.write(buf);
                buf.clear();
            }
            fic.close();
            foc.close();
        }

(3)视图缓冲

       a)  视图缓冲可以让我们更直观的向"卡车(ByteBuffer)"中写入读取基本类型,对视图的修改都会映射成对ByteBuffer中数据的修改.比如写入char型数据可以使用ByteBuffer的           asCharBuffer获得视图CharBuffer然后使用put/get方法写入获取char类型数据.视图的类型:IntBuffer,Shor-
     tBuffer,LongBuffer,DoubleBuffer,CharBuffer,FloatBuffer

(4)操作ByteBuffer:

       a)  操作ByteBuffer方法有:

          1.  position返回/设置当前位置

          2.  limit 返回/设置界限

          3.  mark 记录mark值为当前position值

          4.  reset 重置position为mark值

          5.  remaining返回当前位置与限制之间的元素数

         6.  hasRemaining返回当前位置与

         7.  flip()将当前position设置为limit,将position设置为0

将ByteBuffer中的position想象成在一个栈中的指针,那么在从ByteBuffer取出字节像管道写入的时候就要将指(position)设置在0上然后不断的取出字节指导指针到达数据结尾(limit处)所以写入的时候就要使用flip()方法。从管道取出字节写入到ByteBuffer要将内部的指针设置0 然后清空其内的数据就要使用read方法。

(5)使用Charset:

使用CharSet可以对字节序列进行编码,对字节序列进行编码,静态方法forName("编码类型(GBK之类)")获得CharSet对象

a)  encode(String):对参数进行编码,把得到的字节序列放在一个ByteBuffer对象中,并返回

b)  Encode(CharBuffer)对参数进行编码,把得到的字节序列放在一个buteBuffer中并返回

c)  CharBufferdncode(ByteBuffer):将参数字节序列编码放在CharBuffer中,并返回.

编码与反编码前后使用flip反转缓存limit为position position为0

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
NIO入门
1、I/O输入输出,所有的IO都被视作是单个字节的移动,通过stream对象一次移动一个字节。流IO负责把对象转换为字节,然后再转换为对象。NIO提供了二套NIO,一套是针对标准输入输出NIO,另一套是网络编程NIO2、流与块的比较NIO和IO最大的区别是数据打包和传输方式,IO是以流的方式来处理数据,而NIO是以块的方式处理数据。面向块的IO
Wesley13 Wesley13
2年前
JAVA NIO(一)
1NIO概述1.1NIO(newIO)是一个可以替代javaIOAPI的API,NIO提供了与标准IO不同的工作方式,标准IO是基于字节流和字符流进行操作的,而NIO是基于channel和Buffer进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写到通道中,方式如例图示,JAVANIO的几个核心组成部分是channels,Buf
Stella981 Stella981
2年前
Netty(二)
一、先讲下NIO编程。NIO(NonblockI/O),亦叫做非阻塞I/O与Socket类和ServerSocket类相对应,NIO也提供了SocketChannel和ServerSocketChannel两种不同的套接字通道实现。1 缓冲区Buffer这里首先介绍缓冲区的概念,NIO和原I/O的一个重要区别就是NIO库中,所有数据都是用缓
Wesley13 Wesley13
2年前
Java NIO学习笔记
JavaNIO是什么JavaNIO(NewIO)是从Java1.4版本开始引入的一个新的IOAPI,可以替代标准的JavaIOAPI。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。JavaNIO与IO
Wesley13 Wesley13
2年前
Java NIO:IO与NIO的区别
 一、概念    NIO即NewIO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在JavaAPI中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。二、NIO和IO的主要区别下表总结了JavaIO和NIO之
Wesley13 Wesley13
2年前
JAVA NIO入门(一)
一、JAVANIO概念  JAVANIO是从JDK1.4就开始有的,之前只用过IO流,其实NIO和IO一样都是可以用来读取或者写入文件,只不过原来的IO是面向流进行操作的,而NIO是面向缓冲区进行操作二、通过一个小例子初步了解下NIO如何进行文件读写 !(https://oscimg.oschina.net/oscnet/
Wesley13 Wesley13
2年前
Java Nio 线程
JavaNIO(NewIO)是从Java1.4版本开始引入的 一个新的IOAPI,可以替代标准的JavaIOAPI。 NIO与原来的IO有同样的作用和目的,但是使用 的方式完全不同,NIO支持面向缓冲区的、基于 通道的IO操作。NIO将以更加高效的方式进行文 件的读写操作JavaNIO与IO的主要区别
Wesley13 Wesley13
2年前
Java核心(五)深入理解BIO、NIO、AIO
导读:本文你将获取到:同/异步阻/非阻塞的性能区别;BIO、NIO、AIO的区别;理解和实现NIO操作Socket时的多路复用;同时掌握IO最底层最核心的操作技巧。BIO、NIO、AIO的区别是什么?同/异步、阻/非阻塞的区别是什么?文件读写最优雅的实现方式是什么?NIO如何实现多路复用功能
Wesley13 Wesley13
2年前
NIO阻塞与非阻塞IO
一、使用NIO完成网络通信的三个核心1、通道(Channel):负责连接java.nio.channels.Channel接口|–SelectableChannel|–SocketChannel|–ServerChannel|–DatagramChannel|–Pipe.SinkChannel|–Pipe
Wesley13 Wesley13
2年前
NIO
1、简介1.1Java中的IO介绍1.BIO:BlockingIO,同步式阻塞式IO,即传统的IO,是java中最早期的流2.NIO:NonBlockingIO,又称NewIO,同步式非阻塞IO,是JDK1.4提供的流3.AIO:AsynchronousIO,异步是非阻塞IO,可以认为是NIO的二代版