day34-2(NIO)
1.定义:
-
NIO称为非阻塞IO,非阻塞IO是面向“channel”(通道)的,不是面向“stream(流)”
-
流的特点:方向单一,顺序读写channel特点:双向的,既可以读,又可以写
2.NIO核心API
-
Channel:通道,常见的实现
-
FileChannel:文件通道,可对文件进行读写操作
-
SocketChannel:套接字通道,可以与远端计算机进行TCP读写操作
-
ServerSocketChannel:服务端的套接字通道,用于监听客户端的连接
-
Buffer缓冲区,通道是对缓冲区中的数据进行读写操作常见的缓冲区实现
-
ByteBuffer:字节缓冲区,缓冲区内部内容都是字节
-
position:当前位置,用来表示当前缓冲区已经有多少数据被操作了
-
limit:缓冲区最大可以操作的位置
-
capacity:容量,缓冲区的大小
package com;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* NIO称为非阻塞IO
* 之前学习的是BIO:阻塞是IO,读写过程中可能会发生阻塞现象
*/
public class NIODemo1 {
public static void main(String[] args) throws IOException {
/**
非阻塞IO是面向“channel”(通道)的,不是面向“stream(流)”
流的特点:方向单一,顺序读写
channel特点:双向的,既可以读,又可以写
* */
/*
* NIO核心API
* Channel:通道,常见的实现
* FileChannel:文件通道,可对文件进行读写操作
* SocketChannel:套接字通道,可以与远端计算机进行TCP读写操作
ServerSocketChannel:服务端的套接字通道,用于监听客户端的连接
Buffer缓冲区,通道是对缓冲区中的数据进行读写操作
常见的缓冲区实现
ByteBuffer:字节缓冲区,缓冲区内部内容都是字节
* */
//BIO的文件复制操作,使用流的方式进行复制
/** FileInputStream fis = new FileInputStream("孤勇者.mp3");
FileOutputStream fos = new FileOutputStream("孤勇者_CP.mp3");
byte[] buffer = new byte[1024 * 10];
int len;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
System.out.println("复制完毕!!!!!");
fis.close();
fos.close();*/
//NIO的文件复制操作
FileInputStream fis = new FileInputStream("孤勇者.mp3");
//基于文件输入流获取一个用于读取该文件的文件通道
FileChannel inChannel = fis.getChannel();
FileOutputStream fos = new FileOutputStream("孤勇者——cp.mp3");
FileChannel outChannel = fos.getChannel();
// 字节缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024 * 10);//创建10k大小的缓冲区
int len;//记录每次实际读取的数据量
/*
缓冲区中重要的几个属性:
position:当前位置,用来表示当前缓冲区已经有多少数据被操作了
limit:缓冲区最大可以操作的位置
capacity:容量,缓冲区的大小
默认创建一个缓冲区时:
position=0
limit=capacity
capacity=创建缓冲区时指定的大小
*/
/*
position=0
limit=10240
一次可以读取最多读取数据为:position到limit之间的数据量
limit-position = 10240
*/
// System.out.println("读取前buffer状态=========================");
// System.out.println("position:" + buffer.position());
// System.out.println("limit:" + buffer.limit());
// len = inChannel.read(buffer);//从通道中读取数据到缓冲区中
// System.out.println("读取后buffer状态=========================");
// System.out.println("position:" + buffer.position());
// System.out.println("limit:" + buffer.limit());
// System.out.println("======================进行第二次读取============================");
// System.out.println("读取前buffer状态=========================");
// System.out.println("position:"+buffer.position());
// System.out.println("limit:"+buffer.limit());
/*
position=10240
limit=10240
一次可以读取最多读取数据为:position到limit之间的数据量
limit-position = 0
*/
// len = inChannel.read(buffer);
// System.out.println("本次读取了:"+len+"个字节");
// System.out.println("读取后buffer状态=========================");
// System.out.println("position:"+buffer.position());
// System.out.println("limit:"+buffer.limit());