Java IO的RandomAccessFile的使用

参考:
Java IO的RandomAccessFile的使用

RandomAccessFile是Java中输入,输出流体系中功能最丰富的文件内容访问类,它提供很多方法来操作文件,包括读写支持,与普通的IO流相比,它最大的特别之处就是支持任意访问的方式,程序可以直接跳到任意地方来读写数据。

RandomAccessFile类中比较重要的2个方法如下,其他的方法和普通IO方法类似。RandomAccessFile包含InputStream的三个read方法,也包含OutputStream的三个write方法。同时RandomAccessFile还包含一系列的readXxx和writeXxx方法完成输入输出。

getFilePointer()    
//返回文件记录指针的当前位置
seek(long pos)  
//将文件记录指针定位到pos的位置

构造方法:

 /**
    * model各个参数详解
    * r 代表以只读方式打开指定文件
    * rw 以读写方式打开指定文件
    * rws 读写方式打开,并对内容或元数据都同步写入底层存储设备
    * rwd 读写方式打开,对文件内容的更新同步更新至底层存储设备
    * **/
 public RandomAccessFile(String name, String mode)

使用示例:

1、在电脑桌面新建test.txt,并输入以下数据:

2、java代码:

import java.io.*;

/**
 * Created by Administrator on 2017/5/12.
 */
public class RandomAccessTest {


    public static void main(String[] args) {
        String path = "C:\\Users\\Administrator\\Desktop\\test.txt";

        //任意位置读取
        int seekPointer = 20;
        randomRead(path, seekPointer);//读取的方法

        //追加写
        randomWrite(path);//追加写的方法

        //插入数据
        insert(path, 33, "\nlucene是一个优秀的全文检索库");
    }

    /**
     * 读的方法
     *
     * @param path        文件路径
     * @param seekPointer 指针位置
     **/
    public static void randomRead(String path, int seekPointer) {
        try {
            /**
             * model各个参数详解
             * r 代表以只读方式打开指定文件
             * rw 以读写方式打开指定文件
             * rws 读写方式打开,并对内容或元数据都同步写入底层存储设备
             * rwd 读写方式打开,对文件内容的更新同步更新至底层存储设备
             *
             * **/
            RandomAccessFile raf = new RandomAccessFile(path, "r");
            //获取RandomAccessFile对象文件指针的位置,初始位置是0
            System.out.println("RandomAccessFile文件指针的初始位置:" + raf.getFilePointer());
            raf.seek(seekPointer);//移动文件指针位置

            byte[] buff = new byte[1024];
            //用于保存实际读取的字节数
            int hasRead = 0;
            //循环读取
            while ((hasRead = raf.read(buff)) > 0) {
                //打印读取的内容,并将字节转为字符串输入
                System.out.println(new String(buff, 0, hasRead));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 追加方式
     * 写的方法
     *
     * @param path 文件路径
     ***/
    public static void randomWrite(String path) {
        try {
            /**以读写的方式建立一个RandomAccessFile对象**/
            RandomAccessFile raf = new RandomAccessFile(path, "rw");

            //将记录指针移动到文件最后
            raf.seek(raf.length());
            raf.write("我是追加的 \r\n".getBytes());
            raf.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 实现向指定位置
     * 插入数据
     *
     * @param fileName      文件名
     * @param points        指针位置
     * @param insertContent 插入内容
     **/
    public static void insert(String fileName, long points, String insertContent) {
        try {
            File tmp = File.createTempFile("tmp", null);
            tmp.deleteOnExit();//在JVM退出时删除

            RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
            //创建一个临时文件夹来保存插入点后的数据
            FileOutputStream tmpOut = new FileOutputStream(tmp);
            FileInputStream tmpIn = new FileInputStream(tmp);
            raf.seek(points);
            /**将插入点后的内容读入临时文件夹**/

            byte[] buff = new byte[1024];
            //用于保存临时读取的字节数
            int hasRead = 0;
            //循环读取插入点后的内容
            while ((hasRead = raf.read(buff)) > 0) {
                // 将读取的数据写入临时文件中
                tmpOut.write(buff, 0, hasRead);
            }

            //插入需要指定添加的数据
            raf.seek(points);//返回原来的插入处
            //追加需要追加的内容
            raf.write(insertContent.getBytes());
            //最后追加临时文件中的内容
            while ((hasRead = tmpIn.read(buff)) > 0) {
                raf.write(buff, 0, hasRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行效果:

控制台:

RandomAccessFile文件指针的初始位置:0
he is a techter
hadoop is perfect

test.txt:

i am is a person he is a techt
lucene是一个优秀的全文检索库er
hadoop is perfect
我是追加的 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值