NIO之Buffer
程序员文章站
2024-03-06 16:17:26
...
buffer状态由三个变量显示:
position:跟踪已经写了多少数据或读了多少数据,它指向的是下一个字节来自哪个位置
limit:代表还有多少数据可以取出或还有多少空间可以写入,它的值小于等于capacity。
capacity:代表缓冲区的最大容量,一般新建一个缓冲区的时候,limit的值和capacity的值默认是相等的。
具体实现代码:
package sort;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class Test {
//1.写入数据到 Buffer;
//2.调用 flip() 方法;
//3.从 Buffer 中读取数据;
//4.调用 clear() 方法或者 compact() 方法。
public static void main(String[] args) throws IOException {
FileInputStream fi=null;
FileOutputStream fo=null;
FileChannel inChannel=null;
FileChannel outChannel=null;
try {
//声明源文件和目标文件
fi=new FileInputStream(new File("F:\\test1.txt"));
fo=new FileOutputStream(new File("F:\\test.txt"));
//获得传输通道channel
inChannel=fi.getChannel();
outChannel=fo.getChannel();
//获得容器buffer
ByteBuffer buffer=ByteBuffer.allocate(1024);
//将数据从通道读到缓冲区
int eof =inChannel.read(buffer);
//判断是否读完文件
while(eof!=-1){
//重设一下buffer的position=0,limit=position
buffer.flip();
//把缓冲区数据写入通道中
outChannel.write(buffer);
//重置buffer,重设position=0,limit=capacity
buffer.clear();
//继续读
eof =inChannel.read(buffer);
}
} catch (Exception e) {
System.out.println(e.getMessage());
}finally{
inChannel.close();
outChannel.close();
fi.close();
fo.close();
}
}
}