但行好事  莫问前程

java io(四) 随机访问文件流RandomAccessFile的使用

一. 点睛

java的流体系里面,RandomAccessFile流和推回输入流都属于比较特殊的流,推回输入流的特殊之处在于可以把读取到的数据推回到推回缓冲区,从而可以再次读取,关于推回输入流的更详细内容请参见前面的文章:java io流(二) 推回输入流的原理和简单使用,而RandomAccessFile流是Java输入,输出流体系中功能最丰富的文件内容访问流,它的特殊和强大之处体现在下面两个方面:
1. 功能强大和齐全
io流体系里面某个流要么用于处理输入,要么用于处理输出,而RandomAccessFile流功能比较强大,本身即能完成输入也能完成输出功能,它提供了很多方法来操作文件,既可以读文件(read()方法),也可以写文件(write()方法),这些read()方法和write()方法和其他流的使用方式一样,下面不再赘述。

2. 允许自定义文件记录指针
其他的输入输出流读写数据都是顺序操作,在流的内部会维护一个指针,读写数据的同时,指针会向后移动,直到操作完成为止,而RandomAccessFile流允许我们自由定义文件记录指针的位置。这在我们只希望访问文件的部分内容或者给文件追加内容的时候很有用。

RandomAccessFile流对文件记录指针的操作有下面两个方法,方法声明如下所示:

//返回文件记录指针的当前位置
public native long getFilePointer() throws IOException;

//将文件记录指针定位到pos处
public void seek(long pos) throws IOException;

二. 示例

示例1. 从文件任意位置访问数据

1. 新建测试文件randomAccess.txt,内容随意,我添加的测试内容如下:

2. 编写代码:

package org.light4j.io.randomAccessFile;

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

/**
 * RandomAccessFile测试
 * 
 * @author longjiazuo
 * 
 */
public class RandomAccessFileTest {
    public static void main(String[] args) {

        try
        (
            //创建RandomAccessFile流对象,并指定访问模式为只读模式r
            RandomAccessFile raf = new RandomAccessFile("testFile\\randomAccess.txt","r"); //①  
        ) 
        {
            //获取RandomAccessFile对象记录的指针位置,初始位置为0
            System.out.println("文件指针的初始位置是:"+raf.getFilePointer());
            //移动记录文件的指针
            raf.seek(10);// ②
            System.out.println("现在的文件指针位置是:"+raf.getFilePointer());
            int hasRead=0;
            byte[] cbuff = new byte[1024];
            //循环读取数据
            while((hasRead=raf.read(cbuff))>0){
                //字节转换成字符并输出到控制台
                System.out.println("读取的内容为:"+new String(cbuff,0,hasRead));
            }
            System.out.println("现在的文件指针位置是:"+raf.getFilePointer());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}

代码解释:

RandomAccessFile创建对象时候需要指定一个访问模式,访问模式有四个值,分别如下所示:

  • "r":以只读的方式打开文件,在此模式下,如果试图对RandomAccessFile进行写入方法,将会抛出IOException异常。
  • "rw":以读写方式打开文件。如果文件不存在则会创建文件。
  • "rws":以读写方式打开文件。相对于”rw“模式,还要求对文件的内容或者元数据的每个更新都同步写入到底层的储存设备。
  • "rwd":以读写方式打开文件。相对于”rw“模式,还要求对文件内容的每个更新都同步写入到底层的储存设备。

② 移动文件记录指针到10的位置,从此处开始读取文件。

运行程序,可以看到只读取了文件记录指针后面部分的内容,效果如下所示:

示例2. 给文件追加内容

1. 新建测试文件append.txt,内容随意,我测试添加的内容如下所示:

2. 编写代码:

package org.light4j.io.randomAccessFile;

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

/**
 * <p>
 * 先在工程目录下建立文件append.txt,使用RandomAccessFile流给文件追加内容
 * </p>
 * @author longjiazuo
 * 
 */
public class AppendContent {
    public static void main(String[] args) {
        try 
        (
            //创建RandomAccessFile流对象,并指定访问模式为读写模式rw
            RandomAccessFile raf = new RandomAccessFile("testFile\\append.txt", "rw"); //①
        ) 
        {
            //记录指针移动到文件末尾
            raf.seek(raf.length()); //②
            raf.write("\r\n忆高考".getBytes());
            raf.write("\r\n年年忆今朝,茫茫赶国考;".getBytes());
            raf.write("\r\n不成真秀才,只图自逍遥。".getBytes());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}

代码解释:

① 文件访问模式设置为"rw"
② 追加内容之前并不需要先将文件的内容加载到内存,只需要将文件记录指针移动到文件最后,然后开始向文件输出内容即可。

运行程序,可以看到追加的内容已经添加到文件里面,效果如下所示:

三. 源代码示例

github地址:点击查看
码云地址:点击查看

打赏
欢迎关注人生设计师的微信公众账号
公众号ID:longjiazuoA

未经允许不得转载:人生设计师 » java io(四) 随机访问文件流RandomAccessFile的使用

分享到:更多 ()

人生设计师-接受不同的声音

联系我关于我