编程语言
首页 > 编程语言> > JavaNIO,AIO

JavaNIO,AIO

作者:互联网

  1. Java NIO简介
    Java NIO(New IO Non Blocking IO)是从Java1.4版本开始引入的一个鑫的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区基于通道的IO操作。NIO将以更加高效的方式进行文件的速写操作。
    IO与NIO的区别
    在这里插入图片描述
    Java NIO系统的核心在于:通道(Channel)和缓冲区(Buffer)。通道表示打开到IO设备(例如:文件,套接字)的链接。若需要使用NIO系统,需要获取用于连接IO设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,堆数据进行处理。
    简而言之,channel负责传输,Buffer负责存储。
    缓冲区(Buffer):在Java NIO中负责数据的存取,缓冲区就是数组。用于存储不同数据类型的数据,根据数据类不同(除了boolean类型),提供了相应的基本数据类型的缓冲区,缓冲区的管理方式几乎一直,通过allocate()获取缓冲区
    缓冲区存取数据的两个核心方法:
    put():存入数据到缓冲区中
    get():从缓冲区获取到数据
    缓冲区的四个核心属性:
    capacity:容量,表示缓冲区中最大存储数据的铜梁。一旦什么不能改变。
    limit:界限,表示缓冲区中可以操作数据的大小。limit后面的数据不能进行读写
    position:位置,便是缓冲区中正在操作数据的位置
    mark:标记,表示缓冲区中正在操作数据的位置
    flip():切换到读取数据模式
    rewind():可重复读
    clear():清空缓冲区,但是缓冲区中的数据依然存在,但是处于被遗忘状态,里面的position,limit , capacity回到初始状态。
    mark():标记当前position的位置
    reset();将position恢复到mark标记的位置
    hasRemaining:是否还有可操作的数据
    remaining():获取可操作数据的个数
    非直接缓冲区:通过allocate()方法分配缓冲区,将缓冲区建立在JVM内存中
    在这里插入图片描述
    直接缓冲区:通过allocateDirect()方法分配直接缓冲区,将缓冲区建立在物理内春中。可以提高效率。
    管道(Channel):用于源节点与目标的的连接,在Java NIO中负责缓冲区中的数据的传输。channel本身不存储数据。
    通道的主要实现类
    Java.nio.channels.channel接口
    FileChannel
    SocketChannel
    ServerSocketChannel
    DatagramChannel
    获取通道
    Java针对支持通道的类提供了getChannel()方法
    本地IO:
    FileInputStream/FileOutputStream
    RandomAccessFile
    网络IO:
    Sokect
    ServerSokect
    DatagramSocket
    在JDK1.7中的NIO.2针对各个通道提供了静态方法open()
    在JDK1.7中的NIO.2的Files工具类的newByteChannel()
    通道之间的数据传输
    通过非直接缓冲区进行传输
public static void main(String[] args) throws Exception {
		/* 步骤:
		 * 第一步创建文件对象FileIputStream,FileOutputStream
		 * 第二步:得到channel通道
		 * 第三步:创建字节缓冲区,并将数据写到字节缓冲区里面
		 * 第四步:将缓冲区的数据写到指定文件
		 * 
		*/
		FileInputStream fis = new FileInputStream("a.jpg");
		FileOutputStream fos = new FileOutputStream("1.jpg");
		
		FileChannel iChannel = fis.getChannel();
		FileChannel oChannel = fos.getChannel();
		
		ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
		while (iChannel.read(byteBuffer)!=-1) {
			byteBuffer.flip();
			oChannel.write(byteBuffer);
			byteBuffer.clear();
		}
		oChannel.close();
		iChannel.close();
		fos.close();
		fis.close();
	}

通过直接缓冲区进行传输

public static void main(String[] args) throws Exception {

		FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);
		FileChannel outChannel = FileChannel.open(Paths.get("3.jpg"), StandardOpenOption.CREATE_NEW,
				StandardOpenOption.WRITE, StandardOpenOption.READ);

		MappedByteBuffer inBuffer = inChannel.map(MapMode.READ_ONLY, 0, inChannel.size());
		MappedByteBuffer outBuffer = outChannel.map(MapMode.READ_WRITE, 0, inChannel.size());

		byte[] buf = new byte[inBuffer.limit()];
		System.out.println(inBuffer.limit());
		inBuffer.get(buf);
		outBuffer.put(buf);

	}

transferTo 和transferFrom

public static void main(String[] args) throws Exception {

		FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);
		FileChannel outChannel = FileChannel.open(Paths.get("3.jpg"), StandardOpenOption.CREATE_NEW,
				StandardOpenOption.WRITE, StandardOpenOption.READ);

		inChannel.transferTo(0, inChannel.size(), outChannel);
		inChannel.close();
		//这里有两个方法 transferTo 和transferFrom,所以上面两行代码等价于
		//outChannel.transferFrom(inChannel, 0, inChannel.size());
		//outChannel.close();

	}

分散(Scatter)和聚集(Gather)

字符集:Charset

在这里插入图片描述
编码:字符串->字节数组
解码:字节数组->字符串

  1. Java NIO与IO的主要区别
  2. 缓冲区(Buffer)和通道(channel)
  3. 文件通道(FileChannel)
  4. NIO的非阻塞式网络通信
  5. 管道(Pipe)
  6. Java NIO2(Path, Paths与Files)

标签:JavaNIO,Java,NIO,FileChannel,AIO,inChannel,IO,缓冲区
来源: https://blog.csdn.net/qq_39233290/article/details/94648374