package com.tiger;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* 直接缓冲区,为了加快IO速度,使用一种特殊的方式为其分配内存的缓冲区,
* JDK文档描述:给定一个直接字节缓冲区,java虚拟机将尽可能直接对它执行本机IO操作,
* 也就是说,它会在每一次调用底层操作系统的本机IO之前或之后,
* 尝试避免将缓冲区的内容拷贝到一个中间缓冲区或从一个中间缓冲区中拷贝数据,
* 要分配直接缓冲区,需要调用allocateDirect()方法,而不是allocate()
*
* @description:
* @author: tiger
* @create: 2021-05-02 10:05
*/
public class DirectByteBufferDemo {
public static void main(String[] args) throws IOException {
String filepath = "C:\\note\\Netty\\netty.md";
FileInputStream fis = new FileInputStream(filepath);
FileChannel fci = fis.getChannel();
// 把刚读取的信息写到一个新的文件中
String outfilepath = "C:\\note\\Netty\\netty-out.md";
FileOutputStream fos = new FileOutputStream(outfilepath);
FileChannel fco = fos.getChannel();
// 使用allocateDirect,而不是allocate
ByteBuffer buffer = ByteBuffer.allocateDirect(10);
while (true) {
buffer.clear();
int r = fci.read(buffer);
if (r == -1) break;
buffer.flip();
fco.write(buffer);
}
}
}