您的位置:首页 > 编程语言 > Java开发

java中的FileChannel基本使用

2017-05-17 17:43 549 查看
一获取实例

二读取与写入数据

三关闭

四其它方法
position方法

size方法

truncate方法

force方法

一.获取实例

Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。

我们无法直接打开一个FileChannel,需要通过使用一个InputStream、OutputStream或RandomAccessFile来获取一个FileChannel实例。

//获取方式一
/*------------------------------通过RandomAccessFile来获取FileChannel------------------------------------*/
//RandomAccessFile in = new RandomAccessFile("/Users/kingboy/Desktop/hello.txt","rw");
//RandomAccessFile out = new RandomAccessFile("/Users/kingboy/Desktop/copy.txt","rw");
//FileChannel channelIn = in.getChannel();
//FileChannel channelOut = out.getChannel();

//获取方式二
/*------------------------------通过InputStream,OutputStream来获取FileChannel-----------------------------*/
FileInputStream in = new FileInputStream("/Users/kingboy/Desktop/hello.txt");
FileOutputStream out = new FileOutputStream("/Users/kingboy/Desktop/copy.txt");
FileChannel channelIn = in.getChannel();
FileChannel channelOut = out.getChannel();


二.读取与写入数据

ByteBuffer bf = ByteBuffer.allocate(4096);
//如果读到文件末尾,则返回-1
int count;
while ((count = channelIn.read(bf)) != -1){
//将缓存字节数组的指针设置为数组的开始序列即数组下标0。这样就可以从buffer开头,对该buffer进行遍历(读取)了。
bf.flip();
//对bf读取的数据进行操作
channelOut.write(bf);//写入另一个文件
//强制将内存中数据刷新到硬盘,boolean代表是否刷新属性
channelOut.force(true);
//清空
bf.clear();
}


三.关闭

//关闭
channelIn.close();
channelOut.close();


四.其它方法

position方法

有时可能需要在FileChannel的某个特定位置进行数据的读/写操作。可以通过调用position()方法获取FileChannel的当前位置。

也可以通过调用position(long pos)方法设置FileChannel的当前位置。

这里有两个例子:

long pos = channel.position();
channel.position(pos +123);


如果将位置设置在文件结束符之后,然后试图从文件通道中读取数据,读方法将返回-1 —— 文件结束标志。

如果将位置设置在文件结束符之后,然后向通道中写数据,文件将撑大到当前位置并写入数据。这可能导致“文件空洞”,磁盘上物理文件中写入的数据间有空隙。

size方法

FileChannel实例的size()方法将返回该实例所关联文件的大小。如:

long fileSize = channel.size();


truncate方法

可以使用FileChannel.truncate()方法截取一个文件。截取文件时,文件将中指定长度后面的部分将被删除。如:

channel.truncate(1024);


这个例子截取文件的前1024个字节。

force方法

FileChannel.force()方法将通道里尚未写入磁盘的数据强制写到磁盘上。出于性能方面的考虑,操作系统会将数据缓存在内存中,所以无法保证写入到FileChannel里的数据一定会即时写到磁盘上。要保证这一点,需要调用force()方法。

force()方法有一个boolean类型的参数,指明是否同时将文件元数据(权限信息等)写到磁盘上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java nio