先打個小廣告棒拂,關(guān)注辛星教程,我的微信號xinxing0913酥夭,該項(xiàng)目源碼所在的github地址: https://github.com/xinxing0913/xinxing-nio-guide芹血。
我們前面一直使用的是FileChannel遮精,這里我們來做一個梳理吧。它是java的nio中用于連接文件的通道旺嬉,我們通過文件通道可以讀寫文件的數(shù)據(jù)管行。不過它不可以被設(shè)置為非阻塞模式,它只能被設(shè)置為阻塞模式邪媳。
我們打開一個文件通道可以使用如下方式:
RandomAccessFile file = new RandomeAccessFile("xxxx", "rw");
FileChannel channel = file.getChannel();
我們把數(shù)據(jù)從文件通道讀取到ByteBuffer中的時候捐顷,我們可以首先開辟一個Buffer,然后我們調(diào)用Channel的read方法來讀取即可雨效,read的返回值表示讀取的字節(jié)數(shù)迅涮。范例代碼:
FileChannel channel = xxxx.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(xxx);
int readNum = channel.read(buffer);
向文件通道中寫入數(shù)據(jù)的時候,范例代碼:
FileChannel channel = xxxx.getChannel();
ByteBuffer buffer = ByteBufffer.allocate(xxx);
channel.write(buffer);
別忘記關(guān)閉通道徽龟,一般我們調(diào)用它的close方法即可叮姑,如下所示:
channel.close();
我們可以使用通道的position()方法來獲取其位置,我們也可以用position(int pos)方法來設(shè)置其位置据悔,如下所示:
long pos = channel.position(); // 獲取當(dāng)前位置
channel.position(pos + 2); // 設(shè)置當(dāng)前位置
我們可以使用通道的size()方法獲取當(dāng)前文件的大小传透,如下所示:
long size = channel.size();
我們可以使用通道的truncate()方法進(jìn)行截斷,如下所示:
channel.truncate(1024);
它還有一個force方法屠尊,它表示強(qiáng)制把數(shù)據(jù)刷到磁盤上,如下所示:
channel.force(true);
我們首先來看一下demo08.txt文件中的內(nèi)容把耕拷,如下所示:
首先跟大家說一聲抱歉讼昆,來的太遲了,夢之都經(jīng)歷了較長時間的重構(gòu)骚烧,主要是最近太忙了浸赫。在重構(gòu)之后,整站使用Spring Boot + Bootstrap開發(fā)赃绊,管理頁面使用Spring Boot + Vue開發(fā)既峡。夢之都只為提供優(yōu)秀的學(xué)習(xí)資源,將來會開啟視頻 + pdf + 文章的教程模式碧查。
最近的工作趨于穩(wěn)定运敢,因此也會在周末保持一定的更新頻率校仑。如果您周末有時間,也不妨隨時來看看传惠。學(xué)無止境迄沫,在技術(shù)前進(jìn)的道路上,與君共勉卦方。
專題相關(guān)的內(nèi)容會在近期整理后上線羊瘩,最近在不斷的整理中,第一期預(yù)計會上線的內(nèi)容有jetty盼砍、mysql尘吗、html、rocketmq浇坐、Kafka等幾個內(nèi)容睬捶。
來看一個范例把,代碼如下所示:
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的內(nèi)容:" + new String(buffer.array()));
channel.close();
}
}
然后我們執(zhí)行以下吗跋,我們的執(zhí)行效果如下所示:
不過需要說明的是侧戴,我們的demo08.txt文件也被截斷了,它也只被截取了前64個字節(jié)跌宛,來看一下吧: