先打个小广告,关注辛星教程,我的微信号xinxing0913,该项目源码所在的github地址: https://github.com/xinxing0913/xinxing-nio-guide。
我们前面一直使用的是FileChannel,这里我们来做一个梳理吧。它是java的nio中用于连接文件的通道,我们通过文件通道可以读写文件的数据。不过它不可以被设置为非阻塞模式,它只能被设置为阻塞模式。
我们打开一个文件通道可以使用如下方式:
RandomAccessFile file = new RandomeAccessFile("xxxx", "rw");
FileChannel channel = file.getChannel();
我们把数据从文件通道读取到ByteBuffer中的时候,我们可以首先开辟一个Buffer,然后我们调用Channel的read方法来读取即可,read的返回值表示读取的字节数。范例代码:
FileChannel channel = xxxx.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(xxx);
int readNum = channel.read(buffer);
向文件通道中写入数据的时候,范例代码:
FileChannel channel = xxxx.getChannel();
ByteBuffer buffer = ByteBufffer.allocate(xxx);
channel.write(buffer);
别忘记关闭通道,一般我们调用它的close方法即可,如下所示:
channel.close();
我们可以使用通道的position()方法来获取其位置,我们也可以用position(int pos)方法来设置其位置,如下所示:
long pos = channel.position(); // 获取当前位置
channel.position(pos + 2); // 设置当前位置
我们可以使用通道的size()方法获取当前文件的大小,如下所示:
long size = channel.size();
我们可以使用通道的truncate()方法进行截断,如下所示:
channel.truncate(1024);
它还有一个force方法,它表示强制把数据刷到磁盘上,如下所示:
channel.force(true);
我们首先来看一下demo08.txt文件中的内容把,如下所示:
首先跟大家说一声抱歉,来的太迟了,梦之都经历了较长时间的重构,主要是最近太忙了。在重构之后,整站使用Spring Boot + Bootstrap开发,管理页面使用Spring Boot + Vue开发。梦之都只为提供优秀的学习资源,将来会开启视频 + pdf + 文章的教程模式。
最近的工作趋于稳定,因此也会在周末保持一定的更新频率。如果您周末有时间,也不妨随时来看看。学无止境,在技术前进的道路上,与君共勉。
专题相关的内容会在近期整理后上线,最近在不断的整理中,第一期预计会上线的内容有jetty、mysql、html、rocketmq、Kafka等几个内容。
来看一个范例把,代码如下所示:
package com.mengzhidu.nio.demo;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* 这里集中演示了一下FileChannel的用法
*/
public class Demo8 {
public static void main(String[] args) throws Exception{
RandomAccessFile file = new RandomAccessFile("src/main/resources/demo08.txt", "rw");
FileChannel channel = file.getChannel();
System.out.println("文件的大小为:" + channel.size());
channel.truncate(64);
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer);
System.out.println("buffer的内容:" + new String(buffer.array()));
channel.close();
}
}
然后我们执行以下,我们的执行效果如下所示:
不过需要说明的是,我们的demo08.txt文件也被截断了,它也只被截取了前64个字节,来看一下吧: