JavaNIO,AIO
作者:互联网
- 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
编码:字符串->字节数组
解码:字节数组->字符串
- Java NIO与IO的主要区别
- 缓冲区(Buffer)和通道(channel)
- 文件通道(FileChannel)
- NIO的非阻塞式网络通信
- 管道(Pipe)
- Java NIO2(Path, Paths与Files)
标签:JavaNIO,Java,NIO,FileChannel,AIO,inChannel,IO,缓冲区 来源: https://blog.csdn.net/qq_39233290/article/details/94648374