Java 实现文件随机读写-RandomAccessFile

1.介绍

现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下“Lucene是一款非常优秀的全文检索库”。可能大多数朋友会觉得这个需求很easy,说实话,确实easy,然后XXX君开始实现了,直接使用Java中的流读取了txt文本里原来所有的数据转成字符串后,然后拼接了“Lucene是一款非常优秀的全文检索库”,又写回文本里了,至此,大功告成。后来需求改了,向5G数据的txt文本里追加了,结果XXX君傻了,他内存只有4G,如果强制读取所有的数据并追加,会报内存溢出的异常。

其实上面的需求很简单,如果我们使用JAVA IO体系中的RandomAccessFile类来完成的话,可以实现零内存追加。其实这就是支持任意位置读写类的强大之处。

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

下面来看下RandomAccessFile类中比较重要的2个方法,其他的和普通IO类似
- getFilePointer() 返回文件记录指针的当前位置
- seek(long pos) 将文件记录指针定位到pos的位置

2.例子

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

没有更多推荐了,返回首页