RandomAccessFile 类支持“随机访问”的方式,程序可以直接跳到文件的任意地方来读、写文件(其实我更愿意叫它“随意访问”)----支持只访问文件的部分内容----可以向已存在的文件后追加内容
RandomAccessFile 对象包含一个记录指针,用以标示当前读写处的位置。RandomAccessFile 类对象可以自由移动记录指针:long getFilePointer():获取文件记录指针的当前位置void seek(long pos):将文件记录指针定位到 pos位置
创建 RandomAccessFile 类实例需要指定一个 mode参数,该参数指定 RandomAccessFile 的访问模式:r:以只读方式打开rw:打开以便读取和写入rwd:打开以便读取和写入,同步文件内容的更新rws:打开以便读取和写入,同步文件内容和元数据的更新
JDK 1.4后很多 RandomAccessFile 的功能被转到“内存映射文件”里了,可以考虑使用 memory-mapped files
下面举例说明(注意:直接在指针后 write 将会是覆盖操作,这里只演示插入操作)
// 文本文件的复制(实现读写)@Testpublic void test1() {RandomAccessFile rafin = null;RandomAccessFile rafout = null;try {rafin = new RandomAccessFile("C:/Users/59929/Desktop/test1.txt", "r");rafout = new RandomAccessFile("C:/Users/59929/Documents/test.txt", "rw");int len;byte[] b = new byte[1024];while ((len = rafin.read(b)) != -1) {rafout.write(b, 0, len);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (rafout != null) {try {rafout.close();} catch (IOException e) {e.printStackTrace();}}if (rafin != null) {try {rafin.close();} catch (IOException e) {e.printStackTrace();}}}}// 实现文本文件的插入操作@Testpublic void test2() {RandomAccessFile raf = null;try {raf = new RandomAccessFile("C:/Users/59929/Desktop/test2.txt", "rw");System.out.println("现在指针位置为:" + raf.getFilePointer());raf.seek(16);System.out.println("移到要修改的位置,现在指针位置为:" + raf.getFilePointer());int len;byte[] b = new byte[10];StringBuffer sb = new StringBuffer();while ((len = raf.read(b)) != -1) {sb.append(new String(b, 0, len));}System.out.println("读完后现在指针位置为:" + raf.getFilePointer());raf.seek(16);System.out.println("再次移到要修改的位置,现在指针位置为:" + raf.getFilePointer());raf.write("c".getBytes());raf.write(sb.toString().getBytes());} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (raf != null) {try {raf.close();} catch (IOException e) {e.printStackTrace();}}}}
RandomAccessFile
标签:[] 覆盖 地方 sys 同步 ack top 映射文件 演示