码迷,mamicode.com
首页 > 编程语言 > 详细

Java NIO(四)文件通道

时间:2018-02-23 13:22:15      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:new   这一   工厂方法   style   for   关联   开发者   col   循环   

文件通道

通道是访问I/O服务的导管,I/O可以分为广义的两大类:File I/O和Stream I/O。那么相应的,通道也有两种类型,它们是文件(File)通道和套接字(Socket)通道。文件通道指的是FileChannel,套接字通道则有三个,分别是SocketChannel、ServerSocketChannel和DatagramChannel

通道可以有多种方式创建。Socket通道有直接创建Socket通道的工厂方法(open()方法)。一个FileChannel对象却只能通过在一个打开的RandomAccessFile、FileInputStream或FileOutputStream对象上调用getChannel()方法来获取,开发者不能直接创建一个FileChannel

文件通道总是阻塞的,不能置于非阻塞模式下

FileChannel对象是线程安全的。多个进程可以在同一个实例上并发调用方法而不会引起任何问题,不过并非所有的操作都是多线程的。影响通道位置或者影响文件的操作都是单线程的,如果有一个线程已经在执行会影响通道位置或文件大小的操作,那么其他尝试进行此类操作之一的线程必须等待,并发行为也会受到底层操作系统或文件系统的影响。

 

打开FileChannel

RandomAccessFile aFile = new RandomAccessFile("data.txt", "rw");
FileChannel fileChannel = aFile.getChannel();

 从FileChannel读取数据

ByteBuffer buf = ByteBuffer.allocate(100);
int bytr = fileChannel.read(buf);

 

注意: read()方法返回的int值表示读取了多少字节数到Buffer中,如果为-1,则表示到了文件末尾

向FileChannel中写入数据

1 String str = "some thing";
2 ByteBuffer buf = ByteBuffer.allocate(100);
3 buf.clear();
4 buf.put(str.getBytes());
5 buf.flip();
6 while(buf.hasRemaining()){
7   fileChannel.write(buf);      
8 }
9 fileChannel.close();

 

 注意: write()方法是在while循环里的。因为无法保证write()一次能写入多少字节,因此需要重复调用,知道Buffer中没有尚未写入到Channel中的数据

关闭FileChannel

fileChannel.close();

 

position()方法

有时可能需要在FileChannel中某个特定位置进行数据的读写操作,可以通过position()方法获取FileChannel的当前位置,也可以通过position(long newPosition)设置FileChannel的位置

long position = channel.position();
channel.position(position+10);

 

注意: 如果将位置设置到文件结束符之后,然后读取字节将返回-1,写入字节,文件将扩大到当前位置,并将数据写入通道。这可能导致“文件空洞”,磁盘上物理文件中写入的数据间有空隙

size()方法

long size = fileChannel.size();

 

返回实例所关联的文件大小

truncate()方法

fileChannel.truncate(1024);

 

该方法截取一个文件,截取文件时,文件中指定部分后面的数据将被删除,上面的例子表示截取文件前1024个字节

force()方法

fileChannel.force(true);

 

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

force()方法有一个boolean类型的参数,指明是否同时将文件元数据(权限信息等)写到磁盘上。

Java NIO(四)文件通道

标签:new   这一   工厂方法   style   for   关联   开发者   col   循环   

原文地址:https://www.cnblogs.com/yushangzuiyue/p/8461271.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!