第15章-输入/输出 --- RandomAccessFile

第15章-输入/输出 --- RandomAccessFile

  RandomAccessFile是Java输入/输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出数据。与普通的输入/输出流不同的是,RandomAccessFile支持"随机访问"的方式,程序可以直接跳转到文件的任意地方来读写数据。

  RandomAccessFile对象包含了一个记录指针,用以标识当前读写处的位置,当程序新创建一个RandomAccessFile对象时,该对象的文件记录指针位于文件头(也就是0处),当读/写了n个字节后,向前移动,也可以向后移动。

  RandomAccessFile包含了如下两个方法来操作文件记录指针:

    (1)long getFilePointer():返回文件记录指针的当前位置

    (2)void seek(long pos):将文件记录指针定位到pos位置

 

  RandomAccessFile类有两个构造器,其实这两个构造器基本相同,只是指定文件的形式不同而已---一个使用String参数来指定文件名,一个使用File参数来指定文件本身。除此之外,创建RandomAccessFile对象时还需要指定一个mode参数,该参数指定RandomAccessFile的访问模式,该参数有如下4个值:

    a.   "r" :以只读方式打开指定文件,如果试图对该RandomAccessFile执行写入方法,都将抛出IOException异常。

    b.   "rw" :以只读、写方式打开指定文件。如果该文件尚不存在,则尝试创建该文件。

    c.   "rws": 以读、写方式打开指定文件。相对于"rw"模式,还要求对文件的内容或元数据的每个更新同步写入到底层存储设备。

    d.   "rwd":以读、写方式打开指定文件。相对于"rw"模式,还要求对文件内容的每个更新都同步写到底层存储设备。

  

   下面程序使用了RandomAccessFile来访问指定的中间部分数据

import java.io.RandomAccessFile;

public class RandomAccessFileTest
{
    public static void main(String[] args)
    {
        try
        {
            RandomAccessFile raf = new RandomAccessFile("props.txt","r");
            
            //获取RandomAccessFile对象文件指针的位置,初始位置是0
            System.out.println("RandomAccessFile的文件指针的初始位置:" + raf.getFilePointer());
            
            //移动raf的文件记录指针的位置
            raf.seek(300);
            
            byte[] bbuf = new byte[1024];
            
            //用于保存实际读取的字节数
            int hasRead = 0;
            
            while((hasRead = raf.read(bbuf)) > 0)
            {
                System.out.println(new String(bbuf,0,hasRead));
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

 

 

 下面程序示范了如何向指定文件后追加内容,为了追加内容,程序应该先将记录指针移到到文件最后,然后开始想文件中输出内容:

import java.io.RandomAccessFile;

public class RandomAccessFileAppenContent
{
    public static void main(String[] args)
    {
        try
        {
            RandomAccessFile raf = new RandomAccessFile("props.txt","rw");
            raf.seek(raf.length());
            raf.write("这是新增的内容".getBytes());
            
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

 

  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。