转自 开发者的天空
随机访问文件
允许我们不按照顺序的访问文件的内容,这
里的访问包括读和写。要随机的访问文件,我们就要打开文件,定位到指定的位置,然后读或写文件内容。在Javs SE
7中,SeekableByteChannel接口提供了这个功能。
SeekableByteChannel提供了一些简单易用的方法。依靠这些方法,我们能够设置或查询当前的位置,然后从当前位置读或者往当前位置写。该
接口提供的方法有:
* position – 查询通道当前的位置
* position(long) – 设置通道当前的位置
* read(ByteBuffer) – 从通道向缓冲区读字节内容
* write(ByteBffer) – 将缓冲区内的字节内容写入通道
* truncate(long) – 截断连接到通道的文件(或其他实体)
在实际的使用中,我们可以用Path
.newByteChannel获取一个
SeekableByteChannel实例。在缺省的文件系统上,我们可以直接使用该实例,或者将其转换成FileChannel。
FileChannel提供了一些更高级的特性,如将文件的一部分直接映射到内存中来提高访问速度、锁定文件的一部分、直接在指定的绝对位置读或写而不影
响通道的当前位置等。
下面的例子中,我们打开了一个文件,然后将返回的SeekableByteChannel转换成FileChannel,然后开始我们的文件操作
。首先我们从头开始读取12个字节,然后我们
重新定位到文件开头,从这里开始写如'I was here!\n'。然后我们定位到文件的尾部,再一次添加'I was
here!\n',然后将读取的文件的前12个字节添加到这里。
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
String s = "I was here!\n";
byte data[] = s.getBytes();
ByteBuffer out = ByteBuffer.wrap(data);
ByteBuffer copy = ByteBuffer.allocate(12);
FileChannel fc = null;
Path file = Paths.get("c:\\testChannel.txt");
try {
fc = (FileChannel)file.newByteChannel(StandardOpenOption.READ, StandardOpenOption.WRITE);
//Read the first 12 bytes of the file.
int nread;
do {
nread = fc.read(copy);
} while (nread != -1 && copy.hasRemaining());
//Write "I was here!" at the beginning of the file.
fc.position(0);
while (out.hasRemaining())
fc.write(out);
out.rewind();
/*Move to the end of the file, write "I was here!" again,then copy the first 12 bytes to the end of the file.*/
long length = fc.size();
fc.position(length);
while (out.hasRemaining())
fc.write(out);
copy.flip();
while (copy.hasRemaining())
fc.write(copy);
} catch (IOException x) {
System.out.println("I/O Exception: " + x);
} finally {
//Close the file.
if (fc != null) fc.close();
System.out.println(file + " has been modified!");
}
假设原来的文件内容为
123456789ABCDEF
那么程序执行之后,文件的内容变化为
I was here!
DEFI was here!
123456789ABC
需要注意的是,当定位到文件的末尾是,位置是fc.size(), 并没有减1。如果减了1,原来的文件中最后一个字节会被覆盖。
分享到:
相关推荐
Java虚拟机特性JAVA SE 7.pdf-中文完整书签文字版。 可以复制文本内容
同时,书中不仅完整地讲述了由Java SE 8所引入的新特性,例如对包含默认实现代码的接口方法所做的调用,还讲述了为支持类型注解及方法参数注解而对class文件格式所做的扩展,并阐明了class文件中各属性的含义,以及...
Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝...
java读取共享文件使用jcifs-1.1.11.jar 的SmbFile 类使用用户名密码共享目录操作共享文件
同时,书中不仅完整地讲述了由Java SE 8所引入的新特性,例如对包含默认实现代码的接口方法所做的调用,还讲述了为支持类型注解及方法参数注解而对class文件格式所做的扩展,并阐明了class文件中各属性的含义,以及...
(完整版)Java程序设计任务驱动式教程-任务二十六-随机进出之道(文件的随机访问).ppt
JDK1.8新特性,New Features in Java SE 8
Java7SE Jdk Document的Chm文件。从官方下载的Html转换而来。
java访问https网址下载文件,当网页需要下载证书的时候,代码和操作步骤齐全。
同时,书中不仅完整地讲述了由Java SE 8所引入的新特性,例如对包含默认实现代码的接口方法所做的调用,还讲述了为支持类型注解及方法参数注解而对class文件格式所做的扩展,并阐明了class文件中各属性的含义,以及...
java通过文件头内容判断文件类型
Java虚拟机规范(Java_SE_7)中文版,帮助很多爱好java虚拟机的同学深入学习java虚拟机
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
《Java JDK7学习笔记》针对java se 7新功能全面改版,无论是章节架构或范例程序代码,都做了重新编写与全面翻新。并详细介绍了jvm、jre、java se api、jdk与ide之间的对照关系。必要时从java se api的源代码分析,...
Java自带的HttpURLConnection访问接口文件上传, 含普通参数值传递和文件传递
Java操作zip压缩格式的开源项目,功能强大而且使用方便,能完全满足Java操作Zip压缩文件,官方网址为:http://www.lingala.net/zip4j/ 可以下载到jar包、源码和示例,好像没有提供API文档。 不过需要使用代理访问...
Title: OCA: Oracle Certified Associate Java SE 8 Programmer I Study Guide: Exam 1Z0-808 Author: Jeanne Boyarsky, Scott Selikoff Length: 432 pages Edition: 1 Language: English Publisher: Sybex ...
能够集成到Source Insight中,解决JAVA文件乱码问题
轻松方便的把class文件转化为java文件