现在的位置: 首页 > 综合 > 正文

随机访问文件RandomAccessFile

2016年12月14日 ⁄ 综合 ⁄ 共 1939字 ⁄ 字号 评论关闭

Java几乎所有的数据流都是只读或只写的,这些数据流的外部文件都是顺序文件,如果不创建新的文件就不能更新它们。Java提供了RandomAccessFile类允许在文件的随机位置上进行读写,当创建一个RandomAccessFile数据流时,可以指定两种模式:"r"或"rw"。顾名思义,模式"r"表示这个数据流是只读的,模式"rw"表示这个数据流既可读也可写。例如,如下语句则表示创建一个随机访问文件数据流并允许对文件test.dat进行读出和写入:

RandomAccessFile raf = new RandomAccessFile("H:\\test.dat", "rw");

如果test.dat已经存在则创建RandomAccessFile对象以访问该文件,如果test.dat不存在则创建一个名为test.dat的文件再创建RandomAccessFile对象来访问该文件。

随机访问文件是由字节序列组成的。一个称为文件指针的特殊标记定位这些字节中的某个字节位置。文件的读写操作就是在文件指针所指的位置上进行的。打开文件时文件指针置于文件的起始位置;在文件中进行读写数据后文件指针就会向前移到下一个数据项。

下面的代码我们往RandomAccessFile对象所指向的文件中输出字符串并打印其长度:

package com.aigestudio.test;

import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomAccessFileTest {
	public static void main(String[] args) throws IOException {
		RandomAccessFile raf = new RandomAccessFile("H:\\test.dat", "rw");

		// 设置RandomAccessFile对象长度为0即删除该文件原有内容
		raf.setLength(0);

		// 向文件中写入一段字符串
		raf.writeChars("我是程序猿");

		// 显示RandomAccessFile此刻的长度
		System.out.println(raf.length());

		// 释放资源
		raf.close();
	}
}

打印输出为10,因为1个中文字符占2个字节:

我们可以通过seek(long pos)方法移动文件指针的位置并通过相应的read*()方法读取指针后的数据,我们来看一个简单的例子:

package com.aigestudio.test;

import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomAccessFileTest {
	public static void main(String[] args) throws IOException {
		RandomAccessFile raf = new RandomAccessFile("H:\\test.dat", "rw");

		// 设置RandomAccessFile对象长度为0即删除该文件原有内容
		raf.setLength(0);

		// 向文件中写入一段字符串
		raf.writeChars("我是程序猿");

		// 显示RandomAccessFile此刻的长度
		System.out.println(raf.length());

		// 移动指针位置到“是”后面(也就是将文件指针移至第2x2个字节后)
		raf.seek(2 * 2);

		// 显示此刻的偏移量,即当前文件指针到文件开始位置的字节距离
		System.out.println(raf.getFilePointer());

		// 输出此时文件指针后的一个字符并在读取该字符后将指针后移一个字符
		// 读写操作都可致文件指针移动
		System.out.println(raf.readChar());

		// 再次显示此刻的偏移量,可以发现文件指针已经向后移动了两个字节
		System.out.println(raf.getFilePointer());

		// 再次读取指针后的一个字符,这次我们应该会得到“序”
		System.out.println(raf.readChar());

		// 而文件指针也会被移至“序”之后
		System.out.println(raf.getFilePointer());

		// 这时我们强制将指针移回文件开始的位置
		raf.seek(0);
		System.out.println(raf.getFilePointer());

	

输出结果:

可以看到RandomAccessFile其实非常简单易用,重要的是如何操纵指针和如何读写字节数据,其它的都很简单

抱歉!评论已关闭.