Java IO的RandomAccessFile的使用

来源:互联网 发布:永宏伺服编程 编辑:程序博客网 时间:2024/04/29 23:52

参考:
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文件指针的初始位置:0he is a techterhadoop is perfect

test.txt:

i am is a person he is a techtlucene是一个优秀的全文检索库erhadoop is perfect我是追加的 
0 0
原创粉丝点击