辛星2018年nio教程第六篇:FileChanne梳理

先打个小广告,关注辛星教程,我的微信号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();
    }
}

然后我们执行以下,我们的执行效果如下所示:


image.png

不过需要说明的是,我们的demo08.txt文件也被截断了,它也只被截取了前64个字节,来看一下吧:


image.png

你可能感兴趣的:(辛星2018年nio教程第六篇:FileChanne梳理)