前言
在NIO中使用FileChannel 用于文件数据的读写
FileChannel方法
public int read(ByteBuffer dst)
从通道读取数据并放到缓冲区中,此操作也会移动 Buffer 中的position指针,不断往position中放数据,read完成后position指向limit。
public int write(ByteBuffer src)
把缓冲区的数据写到通道中,此操作也会不断移动Buffer中的position位置直到limit,读取到的数据就是position到limit这两个指针之间的数据。
public long transferFrom(ReadableByteChannel src, long position, long count)
从目标通道中复制数据到当前通道
public long transferTo(long position, long count, WritableByteChannel target)
把数据从当前通道复制给目标通道
该方法拷贝数据使用了零拷贝,通常用来在网络IO传输中,将FileChannel里面的文件数据直接拷贝到与客户端或者服务端连接的Channel里面从而达到文件传输。
将数据写入文件中
package com.boshrong.nio;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class FileChannelTest {
public static void main(String[] args) throws IOException {
// 将数据写入到文件中
String name="bosh_rong 快乐每一天";
//创建一个输出流
File file = new File("d:/test.txt");
FileOutputStream fileOutputStream=new FileOutputStream(file);
// 获取相应的channel
FileChannel channel = fileOutputStream.getChannel();
// 将字符串放入缓存区
ByteBuffer byteBuffer =ByteBuffer.allocate(1024);
//将字符串以字节形式放入buffer中
byteBuffer.put(name.getBytes());
//开始读取
byteBuffer.flip();
//从buffer中读取到文件
channel.write(byteBuffer);
fileOutputStream.close();
}
}
从文件中读取数据
package com.boshrong.nio;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class FileChannelRead {
public static void main(String[] args) throws IOException {
// 使用nio从本地读取一个文件
//File file = new File();
FileInputStream fileInputStream = new FileInputStream("d:/test.txt");
// 获取文件相应的channel,channel中会有相关数据
FileChannel channel = fileInputStream.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
// 将channel的数据读取到buffer
channel.read(buffer);
//System.out.println(buffer);
System.out.println("读取的数据为"+new String(buffer.array()));
fileInputStream.close();
}
}
总结
java 输入输出流对象被 NIO FileChannel 所包裹,使用流对象.getChannel() 获取文件对应的channel。channel.write(buffer); 读取buffer的内容到channel,到了channel 也就到了file . channel.read(buffer) 从通道读取数据放入buffer ,从channel读取数据就相当从对应的流对象读取数据。