RandomAccessFile是Java输入/输出体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出数据。与普通输入/输出流不同的是,RandomAccessFile支持"随机访问"的方式,程序可以调到程序的任意地方来读写数据。RandomAccessFile也有一个局限,就是它只能读写文件,不能读写其他IO节点。
一、构造器
RandomAccessFile有两个构造器:
1.String/File:使用String参数来指定文件名或者使用File参数来指定文件本身。
2.mode:指定RandomAccessFile的访问模式,该参数有如下4个值:
①"r":以只读方式打开文件,如果试图执行写入方法,则会抛出IO异常;
②"rw":以读、写方式打开指定文件。如果该文件尚未存在,则尝试创建该文件;
③"rws":以读、写方式打开指定文件,相对于"rw"模式,还要求对文件的内容或元数据的每个更新都同步写入到底层储存设备。
④"rwd":以读、写方式打开指定文件,相对于"rw"模式,还要求对文件内容的每个更新都同步写入底层设备
二、使用
1.随意读
下面程序使用了RandomAccessFile来访问指定的中间部分数据:
package IO;
import java.io.*;
public class RandomAccessFileTest2
{
public static void main(String[] args)
{
RandomAccessFile raf = null;
try
{
//以只读方式打开一个RandomAccessFile对象
raf = new RandomAccessFile("E:\\Computer\\04JAVA\\JavaCode2\\CrazyJava\\file\\file.txt" , "r");
//获取RandomAccessFile对象文件指针的位置,初始位置是0
System.out.println("RandomAccessFile的文件指针的初始位置:"
+ raf.getFilePointer());
//移动raf的文件记录指针的位置
raf.seek(50);
byte[] bbuf = new byte[1024];
//用于保存实际读取的字节数
int hasRead = 0;
//使用循环来重复“取水”过程
while ((hasRead = raf.read(bbuf)) > 0 )
{
//取出“竹筒”中水滴(字节),将字节数组转换成字符串输出!
System.out.print(new String(bbuf , 0 , hasRead ));
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
finally
{
try
{
if (raf != null)
{
raf.close();
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
}
上面的代码,创建了RandomAccessFile类,该对象以只读方式打开文件;然后将文件记录指针定位到300处,程序将从300字节出开始读、写,接下来的部分也InputStream并没有太大区别。
2.随意写
下面的程序师范了如何想指定文件追加内容,为了追加内容,程序因该先将记录指针移动到文件最后,然后开始向文件中输出内容。
package IO;
import java.io.*;
public class AppendContent2
{
public static void main(String[] args)
{
RandomAccessFile raf = null;
try
{
//以读、写方式打开一个RandomAccessFile对象
raf = new RandomAccessFile("E:\\Computer\\04JAVA\\JavaCode2\\CrazyJava\\file\\file.txt" , "rw");
//将记录指针移动的out.txt文件的最后
raf.seek(raf.length());
raf.write("追加的内容!\r\n".getBytes());
}
catch (IOException ex)
{
ex.printStackTrace();
}
finally
{
try
{
if (raf != null)
{
raf.close();
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
}
以上演示了RandomAccessFile的基本功能操作,需要注意的是,RandomAccessFile依然不能向文件的指定位置插入内容,如果直接讲文件记录指针移动到中间位置进行输出操作,会将指针之后的内容覆盖掉。如果需要想指定位置插入内容,程序需要把插入点之后的内容读入缓冲区,等把需要插入的文字插入文件之后,再将缓冲区的内容追加到文件之后。