NIO通道(channel)原理与获取

一、通道(Channel): 用于源节点与目标节点的连接。在java NIO中负责缓冲区中数据的传输。Channel本身不存储数据,因此需要配合缓冲区进行传输。

二、通道的主要实现类
java.nio.channels.Channel接口:
|– FileChannel
|– SocketChannel
|– ServerSocketChannel
|– DatagramChannel

三、获取通道
1、java针对支持通道的类提供了getChannel()方法
本地IO:
FileInputStream/FileOutputStream
RandomAccessFile
网络IO:
Socket
ServerSocket
DatagramSocket
2、在jdk1.7中NIO.2针对各个通道提供了静态方法open()
3、在jdk1.7中NIO.2的Files工具类的newByteChannel()

1 @Test //利用通道完成文件复制 2 public void test4() throws FileNotFoundException{ 3 FileInputStream fis = new FileInputStream("1.mp4"); 4 FileOutputStream fos=new FileOutputStream("2.mp4"); 5 //1、获取通道 6 FileChannel inChannel = fis.getChannel(); 7 FileChannel outChannel = fos.getChannel(); 8 try { 9 //2、分配一个指定大小的缓冲区 10 ByteBuffer buf=ByteBuffer.allocate(1024); 11 //3、将通道中的数据存入缓冲区 12 while(inChannel.read(buf)!=-1){ 13 //4、将缓冲区中的数据写入通道中 14 buf.flip(); //切换读取数据模式 15 outChannel.write(buf); 16 buf.clear(); 17 } 18 } catch (FileNotFoundException e) { 19 e.printStackTrace(); 20 } catch (IOException e) { 21 e.printStackTrace(); 22 }finally{ 23 try { 24 outChannel.close(); 25 } catch (Exception e) { 26 e.printStackTrace(); 27 } 28 try { 29 inChannel.close(); 30 } catch (IOException e) { 31 e.printStackTrace(); 32 } 33 try { 34 fos.close(); 35 } catch (IOException e) { 36 e.printStackTrace(); 37 } 38 try { 39 fis.close(); 40 } catch (IOException e) { 41 e.printStackTrace(); 42 } 43 } 44 } 45 46 47 @Test //使用直接缓冲区完成文件的复制 48 public void test5() throws IOException{ 49 FileChannel inChannel=FileChannel.open(Paths.get("1.mp4"),StandardOpenOption.READ); 50 FileChannel outChannel=FileChannel.open(Paths.get("2.mp4"),StandardOpenOption.WRITE,StandardOpenOption.READ,StandardOpenOption.CREATE_NEW); 51 //内存映射文件 52 MappedByteBuffer inMappedBuf=inChannel.map(MapMode.READ_ONLY,0,inChannel.size()); 53 MappedByteBuffer outMappedBuf=outChannel.map(MapMode.READ_WRITE,0,inChannel.size()); 54 //直接对缓冲区进行数据的读写操作 55 byte[] dst=new byte[inMappedBuf.limit()]; 56 inMappedBuf.get(dst); 57 outMappedBuf.put(dst); 58 outChannel.close(); 59 inChannel.close(); 60 }

四、通道之间的数据传输

1 @Test // 通道之间的数据传输(直接缓冲区) 2 public void test6() throws IOException{ 3 FileChannel inChannel=FileChannel.open(Paths.get("1.mp4"),StandardOpenOption.READ); 4 FileChannel outChannel=FileChannel.open(Paths.get("2.mp4"),StandardOpenOption.WRITE,StandardOpenOption.READ,StandardOpenOption.CREATE); 5 //inChannel.transferTo(0,inChannel.size(),outChannel); //二选一即可 6 outChannel.transferFrom(inChannel,0,inChannel.size()); 7 outChannel.close(); 8 inChannel.close(); 9 }
点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

JAVA NIO(一)

1NIO概述1.1NIO(newIO)是一个可以替代javaIOAPI的API,NIO提供了与标准IO不同的工作方式,标准IO是基于字节流和字符流进行操作的,而NIO是基于channel和Buffer进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写到通道中,方式如例图示,JAVANIO的几个核心组成部分是channels,Buf

Java NIO 三大组件之 Channel

JavaNIO之Channel一、什么是ChannelChannel用于源节点(例如磁盘)与目的节点的连接,它可以进行读取,写入,映射和读/写文件等操作。在JavaNIO中负责缓冲区中数据的传输。Channel本省不存储数据,因此需要配合缓冲区进行传输。(个人理解其实就是相当于保存两通信地间的

Netty(二)

一、先讲下NIO编程。NIO(NonblockI/O),亦叫做非阻塞I/O与Socket类和ServerSocket类相对应,NIO也提供了SocketChannel和ServerSocketChannel两种不同的套接字通道实现。1 缓冲区Buffer这里首先介绍缓冲区的概念,NIO和原I/O的一个重要区别就是NIO库中,所有数据都是用缓

Java.NIO编程一览笔录

Java标准IO与JavaNIO的简单差异示意: Java标准IOJavaNIOAPI调用简单复杂底层实现面向流(stream),单向面向通道(channel),释放CPU、内存压力成效同步阻塞同步非阻塞数据窥视阻塞读取,要么足够,要么没有使用缓冲区(Buffer),读数据时需要检查是否

NIO通道(channel)原理与获取 - HelloWorld