java7允许我们随机访问文件
1f2f7374e1990b4bb551fd141bc4a53d所谓随机访问就是允许我们不按照顺序的访问文件的内容,这里的访问包括读和写。
要随机的访问文件,我们就要打开文件,定位到指定的位置,然后读或写文件内容。
在Java7中,SeekableByteChannel接口提供了这个功能
SeekableByteChannel提供了一些简单易用的方法。依靠这些方法,我们能够设置或查询当前的位置,然后从当前位置读或者往当前位置写。
该接口提供的方法有:
position – 查询通道当前的位置
position(long) – 设置通道当前的位置
read(ByteBuffer) – 从通道向缓冲区读字节内容
write(ByteBffer) – 将缓冲区内的字节内容写入通道
truncate(long) – 截断连接到通道的文件(或其他实体)
FileChannel实现了该接口。
在实际的使用中,我们可以用FileChannel.open获取一个 FileChannel。
FileChannel提供了一些高级的特性,如将文件的一部分直接映射到内存中来提高访问速度、锁定文件的一部分、直接在指定的绝对位置读或写而不影响通道的当前位置等。
示例:
package java7;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
/**
* @author qiang.xie
* @date 2017/4/7
*/
public class SeekChannal {
public static void main(String[] arg) throws IOException {
FileChannel fileChannel=FileChannel.open(Paths.get("f:\\test.txt"),StandardOpenOption.WRITE,StandardOpenOption.READ,StandardOpenOption.CREATE);
fileChannel.write(ByteBuffer.wrap("hello,java".getBytes()));
fileChannel.position(0);//定位到文件开头
fileChannel.write(ByteBuffer.wrap("seek".getBytes()));
fileChannel.position(fileChannel.size());//定位到文件末尾
fileChannel.write(ByteBuffer.wrap("end".getBytes()));
//将通道中的指定位置开始的内容传输到另一个通道中,这里传输到控制台
fileChannel.transferTo(1,fileChannel.size(),Channels.newChannel(System.out));
}
}
该示例打开一个test.txt文件通道,先写入hello,java,然后再定位到文件开头,写入seek,这意味着会覆盖最开始的hell四个字符,然后定位到文件末尾,再写入end。然后通过transferTo将文件内容传入到控制台。
运行结果:
eeko,javaend
由于可以从指定位置读写文件,SeekableByteChannel使得我们有了很多想象空间。比如你可以使用多线程去从一个很大的文件中去查找某些内容等等。
--
@不迷失|知识改善生活
weixin微信公众号:java技术
专注技术研究与视频教学,分享有价值的技术与经验,关注程序员的发展!
--
网友评论